[FFmpeg-devel] [PATCH] fftools/ffmpeg: use the correct size value for wrapped_avframe packets
James Almer
jamrial at gmail.com
Sun Mar 14 02:42:02 EET 2021
On 3/13/2021 8:44 PM, James Almer wrote:
> pkt->size on packets wrapping an AVFrame signaled by the wrapped_avframe
> codec_id are set to the size of the AVFrame structure and not the actual raw
> data contained in it.
> ffmpeg.c was using those values to print bogus stats about the resulting output
> file.
>
> Before this patch:
> frame= 24 fps=0.0 q=-0.0 Lsize= 7594kB time=00:00:01.00 bitrate=62209.8kbits/s speed= 27x
> video:13kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 60349.488281%
>
> After:
> frame= 24 fps=0.0 q=-0.0 Lsize= 7594kB time=00:00:01.00 bitrate=62209.8kbits/s speed= 28x
> video:7594kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002855%
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> wrapped_avframe should be redefined to stop using sizeof(AVFrame) altogether.
> I'll send a patch with a proposed approach for this.
>
> fftools/ffmpeg.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 2abbc0ff29..6dcf9006db 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -727,7 +727,7 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int u
> {
> AVFormatContext *s = of->ctx;
> AVStream *st = ost->st;
> - int ret;
> + int size, ret;
>
> /*
> * Audio encoders may split the packets -- #frames in != #packets out.
> @@ -842,7 +842,17 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int u
> }
> ost->last_mux_dts = pkt->dts;
>
> - ost->data_size += pkt->size;
> + if (st->codecpar->codec_id == AV_CODEC_ID_WRAPPED_AVFRAME) {
> + AVFrame *frame = (AVFrame *)pkt->data;
> + if (!frame)
> + exit_program(1);
> + size = av_image_get_buffer_size(frame->format, frame->width, frame->height, 1);
> + if (size < 0)
> + exit_program(1);
Changed this locally to fallback to pkt->size to avoid breaking hardware
pixel formats.
> + } else
> + size = pkt->size;
> +
> + ost->data_size += size;
> ost->packets_written++;
>
> pkt->stream_index = ost->index;
>
More information about the ffmpeg-devel
mailing list