Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Zhao Zhili <quinkblack@foxmail.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Zhao Zhili <zhilizhao@tencent.com>
Subject: [FFmpeg-devel] [PATCH v2 5/7] avcodec/mediacodecenc: remove the strategy to create DTS
Date: Wed,  7 Dec 2022 17:31:20 +0800
Message-ID: <tencent_F315AB514E5570E32D6E9AC0407A9ADF9F08@qq.com> (raw)
In-Reply-To: <20221207093122.553668-1-quinkblack@foxmail.com>

From: Zhao Zhili <zhilizhao@tencent.com>

Use input PTS as DTS has multiple problems:
1. If there is no reordering, it's better to just use the output
PTS as DTS, since encoder may change the timestamp value (do it
on purpose or rounding error).

2. If there is reordering, input PTS should be shift a few frames
as DTS to satisfy the requirement of PTS >= DTS. I can't find a
reliable way to determine how many frames to be shift. For example,
we don't known if the encoder use hierarchical B frames. The
max_num_reorder_frames can be get from VUI, but VUI is optional.

3. Encoder dropping frames makes the case worse. Android has an
BITRATE_MODE_CBR_FD option to allow it explicitly.
---
 libavcodec/mediacodecenc.c | 28 +---------------------------
 1 file changed, 1 insertion(+), 27 deletions(-)

diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
index 7f2ae88285..8e28a50e0d 100644
--- a/libavcodec/mediacodecenc.c
+++ b/libavcodec/mediacodecenc.c
@@ -64,18 +64,6 @@ typedef struct MediaCodecEncContext {
 
     uint8_t *extradata;
     int extradata_size;
-
-    // Since MediaCodec doesn't output DTS, use a timestamp queue to save pts
-    // of AVFrame and generate DTS for AVPacket.
-    //
-    // This doesn't work when use Surface as input, in that case frames can be
-    // sent to encoder without our notice. One exception is frames come from
-    // our MediaCodec decoder wrapper, since we can control it's render by
-    // av_mediacodec_release_buffer.
-    int64_t timestamps[32];
-    int ts_head;
-    int ts_tail;
-
     int eof_sent;
 
     AVFrame *frame;
@@ -368,11 +356,6 @@ static int mediacodec_receive(AVCodecContext *avctx,
     }
     memcpy(pkt->data + extradata_size, out_buf + out_info.offset, out_info.size);
     pkt->pts = av_rescale_q(out_info.presentationTimeUs, AV_TIME_BASE_Q, avctx->time_base);
-    if (s->ts_tail != s->ts_head) {
-        pkt->dts = s->timestamps[s->ts_tail];
-        s->ts_tail = (s->ts_tail + 1) % FF_ARRAY_ELEMS(s->timestamps);
-    }
-
     if (out_info.flags & ff_AMediaCodec_getBufferFlagKeyFrame(codec))
         pkt->flags |= AV_PKT_FLAG_KEY;
     ret = 0;
@@ -437,14 +420,8 @@ static int mediacodec_send(AVCodecContext *avctx,
             return ff_AMediaCodec_signalEndOfInputStream(codec);
         }
 
-
-        if (frame->data[3]) {
-            pts = av_rescale_q(frame->pts, avctx->time_base, AV_TIME_BASE_Q);
-            s->timestamps[s->ts_head] = frame->pts;
-            s->ts_head = (s->ts_head + 1) % FF_ARRAY_ELEMS(s->timestamps);
-
+        if (frame->data[3])
             av_mediacodec_release_buffer((AVMediaCodecBuffer *)frame->data[3], 1);
-        }
         return 0;
     }
 
@@ -463,9 +440,6 @@ static int mediacodec_send(AVCodecContext *avctx,
         copy_frame_to_buffer(avctx, frame, input_buf, input_size);
 
         pts = av_rescale_q(frame->pts, avctx->time_base, AV_TIME_BASE_Q);
-
-        s->timestamps[s->ts_head] = frame->pts;
-        s->ts_head = (s->ts_head + 1) % FF_ARRAY_ELEMS(s->timestamps);
     } else {
         flags |= ff_AMediaCodec_getBufferFlagEndOfStream(codec);
         s->eof_sent = 1;
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2022-12-07  9:32 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20221207093122.553668-1-quinkblack@foxmail.com>
2022-12-07  9:31 ` [FFmpeg-devel] [PATCH v2 1/7] avcodec/mediacodecenc: make each encoder has its own option Zhao Zhili
2022-12-07  9:31 ` [FFmpeg-devel] [PATCH v2 2/7] avcodec/mediacodecenc: add bitrate_mode option Zhao Zhili
2022-12-07  9:31 ` [FFmpeg-devel] [PATCH v2 3/7] avcodec/mediacodecenc: add level option Zhao Zhili
2022-12-07  9:31 ` [FFmpeg-devel] [PATCH v2 4/7] avcodec/mediacodecenc: use bsf to handle crop Zhao Zhili
2022-12-09 17:22   ` [FFmpeg-devel] [PATCH v3 3/7] " Zhao Zhili
2022-12-12 15:27     ` Tomas Härdin
2022-12-13  3:20       ` "zhilizhao(赵志立)"
2022-12-14 17:08         ` Tomas Härdin
2022-12-14 17:19           ` Tomas Härdin
2022-12-14 17:37           ` Zhao Zhili
2022-12-14 17:43             ` Zhao Zhili
2022-12-20 18:24             ` Tomas Härdin
2022-12-21  7:17               ` "zhilizhao(赵志立)"
2022-12-21 10:06                 ` Tomas Härdin
2022-12-07  9:31 ` Zhao Zhili [this message]
2022-12-12 15:28   ` [FFmpeg-devel] [PATCH v2 5/7] avcodec/mediacodecenc: remove the strategy to create DTS Tomas Härdin
2022-12-13  2:55     ` "zhilizhao(赵志立)"
2022-12-14 17:31       ` Tomas Härdin
2023-01-04 10:16   ` Anton Khirnov
2023-01-04 11:31     ` [FFmpeg-devel] [Internet]Re: " "zhilizhao(赵志立)"
2023-01-04 13:59       ` Tomas Härdin
2023-01-04 14:46         ` Zhao Zhili
2023-01-04 15:15           ` Anton Khirnov
2023-01-04 16:12             ` Zhao Zhili
2023-01-05  8:07               ` Anton Khirnov
2022-12-07  9:31 ` [FFmpeg-devel] [PATCH v2 6/7] avcodec/mediacodecenc: add max-bframes support Zhao Zhili
2022-12-07  9:31 ` [FFmpeg-devel] [PATCH v2 7/7] avcodec/mediacodecenc: add pts_as_dts option Zhao Zhili

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tencent_F315AB514E5570E32D6E9AC0407A9ADF9F08@qq.com \
    --to=quinkblack@foxmail.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    --cc=zhilizhao@tencent.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git