diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-02-20 00:47:46 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-02-20 01:29:30 +0100 |
commit | be2e211dce2964f922e5dee54a7569ebd6efb0da (patch) | |
tree | a1b6e3a9f5b577230d8c9c2b5b5bcba289ee79f5 /libavcodec | |
parent | f4f386dd00e594dc90eb32ae872ae8e22b08d179 (diff) | |
parent | 6b8b0fe2bc57fdd606074e52ba73cd9b3d95e644 (diff) | |
download | ffmpeg-be2e211dce2964f922e5dee54a7569ebd6efb0da.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
doxy: remove reference to removed api
examples: unbreak compilation
ttadec: cosmetics: reindent
sunrast: use RLE trigger macro inplace of the hard coded value.
sunrastenc: set keyframe flag for the output packet.
mpegvideo_enc: switch to encode2().
mpegvideo_enc: force encoding delay of at least 1 frame when low_delay=0
Conflicts:
doc/examples/muxing.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/flvenc.c | 2 | ||||
-rw-r--r-- | libavcodec/h261enc.c | 2 | ||||
-rw-r--r-- | libavcodec/mjpegenc.c | 13 | ||||
-rw-r--r-- | libavcodec/mpeg12enc.c | 4 | ||||
-rw-r--r-- | libavcodec/mpeg4videoenc.c | 2 | ||||
-rw-r--r-- | libavcodec/mpegvideo.h | 11 | ||||
-rw-r--r-- | libavcodec/mpegvideo_enc.c | 49 | ||||
-rw-r--r-- | libavcodec/rv10enc.c | 2 | ||||
-rw-r--r-- | libavcodec/rv20enc.c | 2 | ||||
-rw-r--r-- | libavcodec/sunrast.c | 2 | ||||
-rw-r--r-- | libavcodec/sunrastenc.c | 1 | ||||
-rw-r--r-- | libavcodec/tta.c | 8 | ||||
-rw-r--r-- | libavcodec/wmv2enc.c | 2 |
13 files changed, 65 insertions, 35 deletions
diff --git a/libavcodec/flvenc.c b/libavcodec/flvenc.c index 2b131a9802..d1484b44e3 100644 --- a/libavcodec/flvenc.c +++ b/libavcodec/flvenc.c @@ -90,7 +90,7 @@ AVCodec ff_flv_encoder = { .id = CODEC_ID_FLV1, .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("Flash Video (FLV) / Sorenson Spark / Sorenson H.263"), diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c index 820677b2d2..35b4abd251 100644 --- a/libavcodec/h261enc.c +++ b/libavcodec/h261enc.c @@ -327,7 +327,7 @@ AVCodec ff_h261_encoder = { .id = CODEC_ID_H261, .priv_data_size = sizeof(H261Context), .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.261"), diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index f68d269c03..6f6d775ca8 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -452,11 +452,10 @@ void ff_mjpeg_encode_mb(MpegEncContext *s, DCTELEM block[6][64]) // maximum over s->mjpeg_vsample[i] #define V_MAX 2 -static int amv_encode_picture(AVCodecContext *avctx, - unsigned char *buf, int buf_size, void *data) -{ +static int amv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, + AVFrame *pic, int *got_packet) - AVFrame* pic=data; +{ MpegEncContext *s = avctx->priv_data; int i; @@ -469,7 +468,7 @@ static int amv_encode_picture(AVCodecContext *avctx, pic->data[i] += (pic->linesize[i] * (s->mjpeg_vsample[i] * (8 * s->mb_height -((s->height/V_MAX)&7)) - 1 )); pic->linesize[i] *= -1; } - return ff_MPV_encode_picture(avctx,buf, buf_size, pic); + return ff_MPV_encode_picture(avctx, pkt, pic, got_packet); } AVCodec ff_mjpeg_encoder = { @@ -478,7 +477,7 @@ AVCodec ff_mjpeg_encoder = { .id = CODEC_ID_MJPEG, .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_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_NONE}, .long_name= NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"), @@ -490,7 +489,7 @@ AVCodec ff_amv_encoder = { .id = CODEC_ID_AMV, .priv_data_size = sizeof(MpegEncContext), .init = ff_MPV_encode_init, - .encode = amv_encode_picture, + .encode2 = amv_encode_picture, .close = ff_MPV_encode_end, .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("AMV Video"), diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 35570eda69..cc77fd1548 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -966,7 +966,7 @@ AVCodec ff_mpeg1video_encoder = { .id = CODEC_ID_MPEG1VIDEO, .priv_data_size = sizeof(MpegEncContext), .init = encode_init, - .encode = ff_MPV_encode_picture, + .encode2 = ff_MPV_encode_picture, .close = ff_MPV_encode_end, .supported_framerates= avpriv_frame_rate_tab+1, .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, @@ -981,7 +981,7 @@ AVCodec ff_mpeg2video_encoder = { .id = CODEC_ID_MPEG2VIDEO, .priv_data_size = sizeof(MpegEncContext), .init = encode_init, - .encode = ff_MPV_encode_picture, + .encode2 = ff_MPV_encode_picture, .close = ff_MPV_encode_end, .supported_framerates= avpriv_frame_rate_tab+1, .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE}, diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c index b8a86d9dbf..343c31644c 100644 --- a/libavcodec/mpeg4videoenc.c +++ b/libavcodec/mpeg4videoenc.c @@ -1346,7 +1346,7 @@ AVCodec ff_mpeg4_encoder = { .id = CODEC_ID_MPEG4, .priv_data_size = sizeof(MpegEncContext), .init = 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}, .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index cbe50ceb87..06c56c9c5a 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -263,6 +263,14 @@ typedef struct MpegEncContext { * offsets used in asm. */ int64_t user_specified_pts;///< last non zero pts from AVFrame which was passed into avcodec_encode_video() + /** + * pts difference between the first and second input frame, used for + * calculating dts of the first frame when there's a delay */ + int64_t dts_delta; + /** + * reordered pts to be used as dts for the next output frame when there's + * a delay */ + int64_t reordered_pts; /** bit output */ PutBitContext pb; @@ -702,7 +710,8 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx); void ff_MPV_frame_end(MpegEncContext *s); int ff_MPV_encode_init(AVCodecContext *avctx); int ff_MPV_encode_end(AVCodecContext *avctx); -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 *frame, int *got_packet); void ff_MPV_common_init_mmx(MpegEncContext *s); void ff_MPV_common_init_axp(MpegEncContext *s); void ff_MPV_common_init_mmi(MpegEncContext *s); diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 65fb660a26..d8bbc67e84 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -897,7 +897,8 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg) AVFrame *pic = NULL; int64_t pts; int i; - const int encoding_delay = s->max_b_frames; + const int encoding_delay = s->max_b_frames ? s->max_b_frames : + (s->low_delay ? 0 : 1); int direct = 1; if (pic_arg) { @@ -915,6 +916,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 { @@ -1384,20 +1388,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+100)+10000)) < 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); } @@ -1557,13 +1564,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, @@ -2385,7 +2406,7 @@ static int encode_thread(AVCodecContext *c, void *arg){ if(s->data_partitioning){ if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){ - av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); + av_log(s->avctx, AV_LOG_ERROR, "encoded partitioned frame too large\n"); return -1; } } @@ -4084,7 +4105,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"), @@ -4111,7 +4132,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}, @@ -4125,7 +4146,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"), @@ -4137,7 +4158,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"), @@ -4149,7 +4170,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"), diff --git a/libavcodec/rv10enc.c b/libavcodec/rv10enc.c index 81f4b94933..add7855b7f 100644 --- a/libavcodec/rv10enc.c +++ b/libavcodec/rv10enc.c @@ -62,7 +62,7 @@ AVCodec ff_rv10_encoder = { .id = CODEC_ID_RV10, .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("RealVideo 1.0"), diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c index 56036db2bb..1eb21803ba 100644 --- a/libavcodec/rv20enc.c +++ b/libavcodec/rv20enc.c @@ -63,7 +63,7 @@ AVCodec ff_rv20_encoder = { .id = CODEC_ID_RV20, .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("RealVideo 2.0"), diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c index cc7a9fb4e4..2dfa902ed0 100644 --- a/libavcodec/sunrast.c +++ b/libavcodec/sunrast.c @@ -165,7 +165,7 @@ static int sunrast_decode_frame(AVCodecContext *avctx, void *data, if (buf_end - buf < 1) return AVERROR_INVALIDDATA; - if ((value = *buf++) == 0x80) { + if ((value = *buf++) == RLE_TRIGGER) { run = *buf++ + 1; if (run != 1) value = *buf++; diff --git a/libavcodec/sunrastenc.c b/libavcodec/sunrastenc.c index 21d6fc47a0..a9b4749758 100644 --- a/libavcodec/sunrastenc.c +++ b/libavcodec/sunrastenc.c @@ -199,6 +199,7 @@ static int sunrast_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, AV_WB32(&avpkt->data[16], s->length); *got_packet_ptr = 1; + avpkt->flags |= AV_PKT_FLAG_KEY; avpkt->size = bytestream2_tell_p(&s->p); return 0; } diff --git a/libavcodec/tta.c b/libavcodec/tta.c index 231b19171d..4dc879cd09 100644 --- a/libavcodec/tta.c +++ b/libavcodec/tta.c @@ -419,10 +419,10 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, // fixed order prediction #define PRED(x, k) (int32_t)((((uint64_t)x << k) - x) >> k) switch (s->bps) { - case 1: *p += PRED(*predictor, 4); break; - case 2: - case 3: *p += PRED(*predictor, 5); break; - case 4: *p += *predictor; break; + case 1: *p += PRED(*predictor, 4); break; + case 2: + case 3: *p += PRED(*predictor, 5); break; + case 4: *p += *predictor; break; } *predictor = *p; diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c index 5f4f70a3fd..ad9d946638 100644 --- a/libavcodec/wmv2enc.c +++ b/libavcodec/wmv2enc.c @@ -217,7 +217,7 @@ AVCodec ff_wmv2_encoder = { .id = CODEC_ID_WMV2, .priv_data_size = sizeof(Wmv2Context), .init = wmv2_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 8"), |