[FFmpeg-devel] [PATCH] cafenc: fill in avg. packet size later if unknown

Lynne dev at lynne.ee
Sat Jul 10 10:42:36 EEST 2021


10 Jul 2021, 03:10 by roman.beranek at prusa3d.cz:

> Frame size of Opus stream was previously presumed here to be 960 samples
> (20ms), however sizes of 120, 240, 480, 1920, and 2880 are also allowed.
> It can also alter on a per-packet basis and even multiple frames may be
> present in a single packet according to the specification, for the sake
> of simplicity however, let us assume that this doesn't occur.
>

Actually 120ms frames are the maximum, so 5760 samples, but that's
irrelevant to the patch.
 

>  if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
>  int64_t file_size = avio_tell(pb);
>  
>  avio_seek(pb, caf->data, SEEK_SET);
>  avio_wb64(pb, file_size - caf->data - 8);
> -        avio_seek(pb, file_size, SEEK_SET);
>  if (!par->block_align) {
> +            int packet_size = samples_per_packet(par->codec_id, par->channels, par->block_align);
> +            if (!packet_size) {
> +                packet_size = st->duration / (caf->packets - 1);
> +                avio_seek(pb, FRAME_SIZE_OFFSET, SEEK_SET);
> +                avio_wb32(pb, packet_size);
> +            }
> +            avio_seek(pb, file_size, SEEK_SET);
>  ffio_wfourcc(pb, "pakt");
>  avio_wb64(pb, caf->size_entries_used + 24);
>  avio_wb64(pb, caf->packets); ///< mNumberPackets
> -            avio_wb64(pb, caf->packets * samples_per_packet(par->codec_id, par->channels, par->block_align)); ///< mNumberValidFrames
> +            avio_wb64(pb, caf->packets * packet_size); ///< mNumberValidFrames
>  avio_wb32(pb, 0); ///< mPrimingFrames
>  avio_wb32(pb, 0); ///< mRemainderFrames
>  avio_write(pb, caf->pkt_sizes, caf->size_entries_used);
>

This doesn't move the pointer back to the file end if par->block_align is set.
I think that's fine though, since the function writes the trailer, which should
mean that nothing more needs to be written.
Patch LGTM. But please, someone yell at Apple to support Opus in MP4,
WebM and OGG, as terrible as that is.


More information about the ffmpeg-devel mailing list