[FFmpeg-devel] [PATCH] lavc/mediacodecdec_h264: add missing NAL headers to SPS/PPS buffers

Matthieu Bouron matthieu.bouron at gmail.com
Wed Jun 29 11:06:56 CEST 2016


On Tue, Jun 28, 2016 at 12:31:33PM +0200, Matthieu Bouron wrote:
> From: Matthieu Bouron <matthieu.bouron at stupeflix.com>
> 
> Fixes regression introduced by 0cd5e281df3f69c1ed8f2a72a5bcbf9691e1b5d5.
> ---
>  libavcodec/mediacodecdec_h264.c | 21 +++++++++++++++++++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/mediacodecdec_h264.c b/libavcodec/mediacodecdec_h264.c
> index eb63ab5..3776b67 100644
> --- a/libavcodec/mediacodecdec_h264.c
> +++ b/libavcodec/mediacodecdec_h264.c
> @@ -112,8 +112,25 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
>      }
>  
>      if (pps && sps) {
> -        ff_AMediaFormat_setBuffer(format, "csd-0", (void*)sps->data, sps->data_size);
> -        ff_AMediaFormat_setBuffer(format, "csd-1", (void*)pps->data, pps->data_size);
> +        uint8_t nal_headers[] = { 0x00, 0x00, 0x00, 0x01 };
> +
> +        uint8_t *data = NULL;
> +        size_t data_size = FFMAX(sps->data_size, pps->data_size) + sizeof(nal_headers);
> +
> +        data = av_mallocz(data_size);
> +        if (!data) {
> +            ret = AVERROR(ENOMEM);
> +            goto done;
> +        }
> +
> +        memcpy(data, nal_headers, sizeof(nal_headers));
> +        memcpy(data + sizeof(nal_headers), sps->data, sps->data_size);
> +        ff_AMediaFormat_setBuffer(format, "csd-0", (void*)data, sps->data_size + sizeof(nal_headers));
> +
> +        memcpy(data + sizeof(nal_headers), pps->data, pps->data_size);
> +        ff_AMediaFormat_setBuffer(format, "csd-1", (void*)data, pps->data_size + sizeof(nal_headers));
> +
> +        av_freep(&data);
>      } else {
>          av_log(avctx, AV_LOG_ERROR, "Could not extract PPS/SPS from extradata");
>          ret = AVERROR_INVALIDDATA;

Pushed to master and release/3.1 branch a slightly different version
(which adds static const to the nal_headers declaration).

To bring more context, the regression introduced by
0cd5e281df3f69c1ed8f2a72a5bcbf9691e1b5d5 prevented the decoders of Samsung
devices to work.

Matthieu


More information about the ffmpeg-devel mailing list