|
|
|
@ -909,6 +909,9 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg) |
|
|
|
|
"last=%"PRId64"\n", pts, s->user_specified_pts); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!s->low_delay && pic_arg->display_picture_number == 1) |
|
|
|
|
s->dts_delta = time - last; |
|
|
|
|
} |
|
|
|
|
s->user_specified_pts = pts; |
|
|
|
|
} else { |
|
|
|
@ -1374,20 +1377,23 @@ no_output_pic: |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_MPV_encode_picture(AVCodecContext *avctx, |
|
|
|
|
unsigned char *buf, int buf_size, void *data) |
|
|
|
|
int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
|
const AVFrame *pic_arg, int *got_packet) |
|
|
|
|
{ |
|
|
|
|
MpegEncContext *s = avctx->priv_data; |
|
|
|
|
AVFrame *pic_arg = data; |
|
|
|
|
int i, stuffing_count; |
|
|
|
|
int i, stuffing_count, ret; |
|
|
|
|
int context_count = s->slice_context_count; |
|
|
|
|
|
|
|
|
|
if (!pkt->data && |
|
|
|
|
(ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < context_count; i++) { |
|
|
|
|
int start_y = s->thread_context[i]->start_mb_y; |
|
|
|
|
int end_y = s->thread_context[i]-> end_mb_y; |
|
|
|
|
int h = s->mb_height; |
|
|
|
|
uint8_t *start = buf + (size_t)(((int64_t) buf_size) * start_y / h); |
|
|
|
|
uint8_t *end = buf + (size_t)(((int64_t) buf_size) * end_y / h); |
|
|
|
|
uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h); |
|
|
|
|
uint8_t *end = pkt->data + (size_t)(((int64_t) pkt->size) * end_y / h); |
|
|
|
|
|
|
|
|
|
init_put_bits(&s->thread_context[i]->pb, start, end - start); |
|
|
|
|
} |
|
|
|
@ -1547,13 +1553,27 @@ vbv_retry: |
|
|
|
|
} |
|
|
|
|
s->total_bits += s->frame_bits; |
|
|
|
|
avctx->frame_bits = s->frame_bits; |
|
|
|
|
|
|
|
|
|
pkt->pts = s->current_picture.f.pts; |
|
|
|
|
if (!s->low_delay) { |
|
|
|
|
if (!s->current_picture.f.coded_picture_number) |
|
|
|
|
pkt->dts = pkt->pts - s->dts_delta; |
|
|
|
|
else |
|
|
|
|
pkt->dts = s->reordered_pts; |
|
|
|
|
s->reordered_pts = s->input_picture[0]->f.pts; |
|
|
|
|
} else |
|
|
|
|
pkt->dts = pkt->pts; |
|
|
|
|
if (s->current_picture.f.key_frame) |
|
|
|
|
pkt->flags |= AV_PKT_FLAG_KEY; |
|
|
|
|
} else { |
|
|
|
|
assert((put_bits_ptr(&s->pb) == s->pb.buf)); |
|
|
|
|
s->frame_bits = 0; |
|
|
|
|
} |
|
|
|
|
assert((s->frame_bits & 7) == 0); |
|
|
|
|
|
|
|
|
|
return s->frame_bits / 8; |
|
|
|
|
pkt->size = s->frame_bits / 8; |
|
|
|
|
*got_packet = !!pkt->size; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void dct_single_coeff_elimination(MpegEncContext *s, |
|
|
|
@ -4042,7 +4062,7 @@ AVCodec ff_h263_encoder = { |
|
|
|
|
.id = CODEC_ID_H263, |
|
|
|
|
.priv_data_size = sizeof(MpegEncContext), |
|
|
|
|
.init = ff_MPV_encode_init, |
|
|
|
|
.encode = ff_MPV_encode_picture, |
|
|
|
|
.encode2 = ff_MPV_encode_picture, |
|
|
|
|
.close = ff_MPV_encode_end, |
|
|
|
|
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
|
|
|
|
.long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"), |
|
|
|
@ -4069,7 +4089,7 @@ AVCodec ff_h263p_encoder = { |
|
|
|
|
.id = CODEC_ID_H263P, |
|
|
|
|
.priv_data_size = sizeof(MpegEncContext), |
|
|
|
|
.init = ff_MPV_encode_init, |
|
|
|
|
.encode = ff_MPV_encode_picture, |
|
|
|
|
.encode2 = ff_MPV_encode_picture, |
|
|
|
|
.close = ff_MPV_encode_end, |
|
|
|
|
.capabilities = CODEC_CAP_SLICE_THREADS, |
|
|
|
|
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
|
|
|
@ -4083,7 +4103,7 @@ AVCodec ff_msmpeg4v2_encoder = { |
|
|
|
|
.id = CODEC_ID_MSMPEG4V2, |
|
|
|
|
.priv_data_size = sizeof(MpegEncContext), |
|
|
|
|
.init = ff_MPV_encode_init, |
|
|
|
|
.encode = ff_MPV_encode_picture, |
|
|
|
|
.encode2 = ff_MPV_encode_picture, |
|
|
|
|
.close = ff_MPV_encode_end, |
|
|
|
|
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
|
|
|
|
.long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"), |
|
|
|
@ -4095,7 +4115,7 @@ AVCodec ff_msmpeg4v3_encoder = { |
|
|
|
|
.id = CODEC_ID_MSMPEG4V3, |
|
|
|
|
.priv_data_size = sizeof(MpegEncContext), |
|
|
|
|
.init = ff_MPV_encode_init, |
|
|
|
|
.encode = ff_MPV_encode_picture, |
|
|
|
|
.encode2 = ff_MPV_encode_picture, |
|
|
|
|
.close = ff_MPV_encode_end, |
|
|
|
|
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
|
|
|
|
.long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"), |
|
|
|
@ -4107,7 +4127,7 @@ AVCodec ff_wmv1_encoder = { |
|
|
|
|
.id = CODEC_ID_WMV1, |
|
|
|
|
.priv_data_size = sizeof(MpegEncContext), |
|
|
|
|
.init = ff_MPV_encode_init, |
|
|
|
|
.encode = ff_MPV_encode_picture, |
|
|
|
|
.encode2 = ff_MPV_encode_picture, |
|
|
|
|
.close = ff_MPV_encode_end, |
|
|
|
|
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, |
|
|
|
|
.long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"), |
|
|
|
|