mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
lavc/mpegvideo_enc: handle frame durations and AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
For delay-capable encoders, i.e. mpeg12 and mpeg4video. Generic code in encode.c already handles this for all other mpegvideo encoders.
This commit is contained in:
parent
8a60a9c74c
commit
c44a3dba9e
@ -1246,7 +1246,8 @@ const FFCodec ff_mpeg1video_encoder = {
|
||||
.p.supported_framerates = ff_mpeg12_frame_rate_tab + 1,
|
||||
.p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
|
||||
AV_PIX_FMT_NONE },
|
||||
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
|
||||
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |
|
||||
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
|
||||
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
||||
.p.priv_class = &mpeg1_class,
|
||||
};
|
||||
@ -1264,7 +1265,8 @@ const FFCodec ff_mpeg2video_encoder = {
|
||||
.p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
|
||||
AV_PIX_FMT_YUV422P,
|
||||
AV_PIX_FMT_NONE },
|
||||
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
|
||||
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |
|
||||
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
|
||||
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
||||
.p.priv_class = &mpeg2_class,
|
||||
};
|
||||
|
@ -1403,7 +1403,8 @@ const FFCodec ff_mpeg4_encoder = {
|
||||
FF_CODEC_ENCODE_CB(ff_mpv_encode_picture),
|
||||
.close = ff_mpv_encode_end,
|
||||
.p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
|
||||
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
|
||||
.p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |
|
||||
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
|
||||
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
||||
.p.priv_class = &mpeg4enc_class,
|
||||
};
|
||||
|
@ -1952,6 +1952,7 @@ vbv_retry:
|
||||
s->total_bits += s->frame_bits;
|
||||
|
||||
pkt->pts = s->current_picture.f->pts;
|
||||
pkt->duration = s->current_picture.f->duration;
|
||||
if (!s->low_delay && s->pict_type != AV_PICTURE_TYPE_B) {
|
||||
if (!s->current_picture.f->coded_picture_number)
|
||||
pkt->dts = pkt->pts - s->dts_delta;
|
||||
@ -1960,6 +1961,14 @@ vbv_retry:
|
||||
s->reordered_pts = pkt->pts;
|
||||
} else
|
||||
pkt->dts = pkt->pts;
|
||||
|
||||
// the no-delay case is handled in generic code
|
||||
if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY) {
|
||||
ret = ff_encode_reordered_opaque(avctx, pkt, s->current_picture.f);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (s->current_picture.f->key_frame)
|
||||
pkt->flags |= AV_PKT_FLAG_KEY;
|
||||
if (s->mb_info)
|
||||
|
Loading…
Reference in New Issue
Block a user