[FFmpeg-devel] [PATCH] avcodec/h264_mp4toannexb_bsf: add No IDR frame situation
mypopy at gmail.com
mypopy at gmail.com
Wed Aug 15 10:27:53 EEST 2018
On Wed, Aug 15, 2018 at 2:38 PM Linjie Fu <linjie.fu at intel.com> wrote:
>
> Fix the live stream encoding problem using qsv when the first frame
> is not an IDR frame.
>
> Add the extradata information when the IDR frame is missing in the
> first GOP.
>
> Fixes the bug reported in ticket #6418.
>
> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> ---
> libavcodec/h264_mp4toannexb_bsf.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/h264_mp4toannexb_bsf.c b/libavcodec/h264_mp4toannexb_bsf.c
> index 794c82e650..fbbfe3f7dd 100644
> --- a/libavcodec/h264_mp4toannexb_bsf.c
> +++ b/libavcodec/h264_mp4toannexb_bsf.c
> @@ -33,6 +33,7 @@ typedef struct H264BSFContext {
> int32_t pps_offset;
> uint8_t length_size;
> uint8_t new_idr;
> + uint8_t new_nal_slice;
> uint8_t idr_sps_seen;
> uint8_t idr_pps_seen;
> int extradata_parsed;
> @@ -243,6 +244,7 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
> buf, nal_size, 1)) < 0)
> goto fail;
> s->new_idr = 0;
> + s->new_nal_slice = 1;
> /* if only SPS has been seen, also insert PPS */
> } else if (s->new_idr && unit_type == H264_NAL_IDR_SLICE && s->idr_sps_seen && !s->idr_pps_seen) {
> if (s->pps_offset == -1) {
> @@ -253,7 +255,16 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
> ctx->par_out->extradata + s->pps_offset, ctx->par_out->extradata_size - s->pps_offset,
> buf, nal_size, 1)) < 0)
> goto fail;
> - } else {
> + }else if (s->new_idr && !s->new_nal_slice && H264_NAL_SLICE == unit_type && !s->idr_sps_seen && !s->idr_pps_seen)
> + {
> + av_log(ctx, AV_LOG_WARNING, "first H264_NAL_SLICE when there is no IDR.\n");
> + if ((ret = alloc_and_copy(out, ctx->par_out->extradata, ctx->par_out->extradata_size, buf, nal_size, 1)) < 0)
> + goto fail;
> + s->new_nal_slice = 1;
> + s->new_idr = 0;
> + }
> +
> + else {
> if ((ret=alloc_and_copy(out, NULL, 0, buf, nal_size, unit_type == H264_NAL_SPS || unit_type == H264_NAL_PPS)) < 0)
> goto fail;
> if (!s->new_idr && unit_type == H264_NAL_SLICE) {
> --
Need to follow FFmpeg coding style, I think, more information, you can
refer to the link: https://www.ffmpeg.org/developer.html. Thanks.
More information about the ffmpeg-devel
mailing list