[Libav-user] MP4/AAC and rewriting pic_parameter_set_id in slice header

Stefan Hellkvist hellkvist at gmail.com
Tue Feb 21 18:17:46 EET 2017


I am trying to write an MP4 from a received H264 stream using libav. The
first SPS and PPS NALS I receive I copy and set as the extradata for the
codec. All the other SPS and PPS NALS I drop.

This method seems to work with streams coming from for instance Google
Chrome which always seem to have NALS that use pic_parameter_set_id = 0,
but it does not work with streams where the pic_parameter_set_id is growing
incrementally (the encoder sends new SPS and PPS packets which I ignore at
the moment). When I play the resulting MP4 in ffplay it play the first IDR
and the following P frames but it will stop and complain for all other
frames, like the example below:

[h264 @ 0x7fe831814600] non-existing PPS 5 referenced
[h264 @ 0x7fe831814600] decode_slice_header error
[h264 @ 0x7fe831814600] no frame!

for all frames that has pic_parameter_set_id larger than 0.

I am relatively new to MP4 and H264 but I guess this is because I simply do
not have the referenced PPS/SPS info in the extradata (only the first one
at index 0).

So my question is - how would you get around this problem? Is it possible
to make libav rewrite the pic_parameter_set_id for each frame that I send
it, so that all frames reference the first SPS/PPS (because it only seems
like new copies of the initial SPS/PPS but with new ids)? Or does anyone
have code that does this currently outside of libav? Because I should not
have to gather all SPS/PPS packets and store them in the extradata, or
should I? Or, yet another or, am I totally clueless as to what I am talking
about and is the problem something else?

Kindest regards,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20170221/3c510eb0/attachment.html>

More information about the Libav-user mailing list