[FFmpeg-devel] Patch to libavc/opus to create extradata if missing

Jonathan Baudanza jon at jonb.org
Wed Dec 30 01:25:02 EET 2020


On Tue, Dec 29, 2020, at 6:41 AM, Lynne wrote:
> Dec 28, 2020, 19:03 by jon at jonb.org:
> 
> >> Actually its not impossible to create extradata from raw Opus streams.
> >> The extradata only contains a magic, #channes, padding, a sample rate and
> >> a channel_family.
> >>
> >> We know the magic, the #channels can be found out via the packet's
> >> contents and whether it contains multiple packets, the padding would
> >> be 0 because its a stream, the sample rate is always 48000 (we purpusefully
> >> disrespect the container's sample rate in case of Opus, which this is),
> >> and the mapping family can be set to 255 to just let the decoder decide
> >> on the number of channels.
> >>
> >>
> >> > The RTP demuxer should start exporting extradata instead, if possible. Either generated from available stream information, or taken verbatim if present. Not sure how the RTP encapsulation for Opus is defined in this regard.
> >> >
> >>
> >> Yes, I think that's the best solution. Just follow the steps I described above, and
> >> to write it out you can check out the opus_write_extradata() function in
> >> libavcodec/opusenc.c.
> >>
> >
> > Thank you for the feedback everyone. I agree, the RTP demuxer is the best place for this. I will resubmit the patch as such.
> >

Thank you for all the feedback everyone. I've updated the patch to build the opus header inside of ff_rtp_parse_open in libavformat/rtpdec.c. 

I set the mapping_family to 0, since I believe Opus/RTP only supports 2 channels. I set the input sample rate to 0, which the spec considers "unspecified". Let me know what you think of this approach for these values. Happy to switch them to 255/48000 if you prefer.

I copied the bytestream code from opusenc.c.  There's now 3 or 4 different places in the codebase where opus headers are getting built. Let me know if you'd like me to refactor this a bit. I didn't want to touch too many components with my first patch.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-ff_rtp_parse_open-builds-Opus-head-in-extradata.patch
Type: application/octet-stream
Size: 1916 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20201229/7b9a6676/attachment.obj>


More information about the ffmpeg-devel mailing list