[FFmpeg-devel] [PATCH] avformat/hlsenc: compute video_keyframe_size after write keyframe

Steven Liu lingjiujianke at gmail.com
Tue Oct 20 06:43:48 EEST 2020


Steven Liu <lq at chinaffmpeg.org> 于2020年9月18日周五 上午9:53写道:
>
> fix ticket: 8636
> When write keyframe and the keyframe is the frist packet of the segment,
> then compute the size of the keyframe which have been write into segment
> first packet. and set the start position of the segment, should not use
> avio_tell(vs->out) to get the keyframe position, because it can be set
> to 0 if close at above of the workflow, that maybe inaccurate, but the
> start_pos can be used here, because start_pos is set after write
> the previous packet.
>
> Signed-off-by: Steven Liu <lq at chinaffmpeg.org>
> ---
>  libavformat/hlsenc.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
> index cb31d6aed7..8687d7c12c 100644
> --- a/libavformat/hlsenc.c
> +++ b/libavformat/hlsenc.c
> @@ -2572,13 +2572,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
>
>      vs->packets_written++;
>      if (oc->pb) {
> +        int64_t keyframe_pre_pos = avio_tell(oc->pb);
>          ret = ff_write_chained(oc, stream_index, pkt, s, 0);
> -        vs->video_keyframe_size += pkt->size;
> -        if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) && (pkt->flags & AV_PKT_FLAG_KEY)) {
> -            vs->video_keyframe_size = avio_tell(oc->pb);
> -        } else {
> -            vs->video_keyframe_pos = avio_tell(vs->out);
> +        if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) &&
> +            (pkt->flags & AV_PKT_FLAG_KEY) && !keyframe_pre_pos) {
> +            av_write_frame(oc, NULL); /* Flush any buffered data */
> +            vs->video_keyframe_size = avio_tell(oc->pb) - keyframe_pre_pos;
>          }
> +        vs->video_keyframe_pos = vs->start_pos;
>          if (hls->ignore_io_errors)
>              ret = 0;
>      }
> --
> 2.25.0
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".

Pushed


Thanks
Steven


More information about the ffmpeg-devel mailing list