From patchwork Fri Aug 16 23:13:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Li X-Patchwork-Id: 14560 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 893C544825D for ; Sat, 17 Aug 2019 02:13:37 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 700D268AC7E; Sat, 17 Aug 2019 02:13:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DE5FD68ABB0 for ; Sat, 17 Aug 2019 02:13:30 +0300 (EEST) Received: by mail-pg1-f194.google.com with SMTP id u17so3648926pgi.6 for ; Fri, 16 Aug 2019 16:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=xbIEDYUlN5daRIntn8xyHD066U3UvS0XPNF7VhBKnDI=; b=sUZ1py6POYSjoWecHs/18wqwefhmDGArh21KHdnJFOAmKRpEzZEcUG+oqeveuNqXKO fkOzmm6XNu0AHSEJNrOht9oTOkCbqmHIfqFS1ajqJHEVa04EKpBBZdFN3Bft6/85gDwZ zcI8sBUbVfZn04TcGRkQXGF+r9Rn/b9sWyK64AKF2gB9MaHqhz2Idfs8AKYnAW4gIh8V sNNzEDLFP/IfFIq9AaiKBufoNKc4DjiFBz+3taj3rjaNfXN6ttAFrz7Ulpbua5Q5p04b R8NGZRWf1Tzk5pZ+izd0bPHh3Z6BChgCRZVUNsIrXNP48BVUF3mekrUjaeBaMJuHvHXD 0irQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=xbIEDYUlN5daRIntn8xyHD066U3UvS0XPNF7VhBKnDI=; b=XKdXp8f1O6ProM2mK8benjwWX6jb1fNDkJEATunbKzGM7sQ1Ggu6KU1Rmrra0KONhQ XD+f1pM8J6aR+abNQtsgNcWZLz1VHcHZQn8JCkCjwn69sDVmTKhlTJT0cM1ojD2N+E1o 4FRx5DCZyJbac4tu+wvpp3FT1Afjf1XjORR0Lx89lLzKCeTW9hMbeyWCp5+vAeZ/2pGQ 7Hgz4p1w1bkCYbvmZYNhhxxaJQQ0kmH9+jrOyOem0VKMXTBzEFk9PpyMYmTqNslftLxA czCADRNCX9hUYSnoaCKOdrItLjujAGodOTqczemW0xv62QyzAIESK812B2afV2oxjjy+ t+WA== X-Gm-Message-State: APjAAAVAyJxg5Tjp5OXqFC0/Q3n4nSgTGoze/6925HK+jclGtqMBgh28 odtq/QDKkyTVYZ3dXV2Pk3AoASfE X-Google-Smtp-Source: APXvYqwUF9wrm9j01S0LgagdvtKK+ebcfirYCfDKe5Ihlvhz8xOMvGkTARnWIdb/G6ms3AZ5SebwXw== X-Received: by 2002:a62:1d11:: with SMTP id d17mr13205229pfd.249.1565997208871; Fri, 16 Aug 2019 16:13:28 -0700 (PDT) Received: from jun-ubuntu.corp.microsoft.com ([2001:4898:80e8:2:7d6f:114a:e83e:a6e]) by smtp.googlemail.com with ESMTPSA id f10sm3050353pjw.14.2019.08.16.16.13.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Aug 2019 16:13:28 -0700 (PDT) From: Jun Li To: ffmpeg-devel@ffmpeg.org Date: Fri, 16 Aug 2019 16:13:22 -0700 Message-Id: <20190816231322.26205-1-junli1026@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v1] avcodec/h264_mp4toannexb_bsf: force sps/pps writing before the first pict X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fix #6869, write sps/pps before the first picture nal, no matter what type of picture it is. --- libavcodec/h264_mp4toannexb_bsf.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libavcodec/h264_mp4toannexb_bsf.c b/libavcodec/h264_mp4toannexb_bsf.c index fb3f24ea40..e616c4c210 100644 --- a/libavcodec/h264_mp4toannexb_bsf.c +++ b/libavcodec/h264_mp4toannexb_bsf.c @@ -36,6 +36,7 @@ typedef struct H264BSFContext { uint8_t idr_sps_seen; uint8_t idr_pps_seen; int extradata_parsed; + int first_pict; } H264BSFContext; static int alloc_and_copy(AVPacket *out, @@ -160,6 +161,7 @@ static int h264_mp4toannexb_init(AVBSFContext *ctx) s->idr_sps_seen = 0; s->idr_pps_seen = 0; s->extradata_parsed = 1; + s->first_pict = 0; } else { av_log(ctx, AV_LOG_ERROR, "Invalid extradata size: %d\n", extra_size); return AVERROR_INVALIDDATA; @@ -207,6 +209,9 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out) buf += s->length_size; unit_type = *buf & 0x1f; + if (!s->first_pict && (unit_type == H264_NAL_IDR_SLICE || unit_type == H264_NAL_SLICE)) + s->first_pict = 1; + if (nal_size > buf_end - buf || nal_size < 0) goto fail; @@ -236,15 +241,15 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out) if (!s->new_idr && unit_type == H264_NAL_IDR_SLICE && (buf[1] & 0x80)) s->new_idr = 1; - /* prepend only to the first type 5 NAL unit of an IDR picture, if no sps/pps are already present */ - if (s->new_idr && unit_type == H264_NAL_IDR_SLICE && !s->idr_sps_seen && !s->idr_pps_seen) { + /* prepend only to the first type 5 NAL unit of an IDR picture or the first pict NAL of the entire stream, if no sps/pps are already present */ + if ((s->new_idr && unit_type == H264_NAL_IDR_SLICE || s->first_pict == 1) && !s->idr_sps_seen && !s->idr_pps_seen) { if ((ret=alloc_and_copy(out, ctx->par_out->extradata, ctx->par_out->extradata_size, buf, nal_size, 1)) < 0) goto fail; s->new_idr = 0; /* 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) { + } else if ((s->new_idr && unit_type == H264_NAL_IDR_SLICE || s->first_pict == 1) && s->idr_sps_seen && !s->idr_pps_seen) { if (s->pps_offset == -1) { av_log(ctx, AV_LOG_WARNING, "PPS not present in the stream, nor in AVCC, stream may be unreadable\n"); if ((ret = alloc_and_copy(out, NULL, 0, buf, nal_size, 0)) < 0) @@ -263,6 +268,10 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out) } } + /* first picture has been found, set the flag to -1 */ + if (s->first_pict == 1) + s->first_pict = -1; + next_nal: buf += nal_size; cumul_size += nal_size + s->length_size;