[FFmpeg-devel] [PATCH v2 2/3] avcodec/rawenc: propagate the Producer Reference time

James Almer jamrial at gmail.com
Sat Nov 30 04:21:55 EET 2024


On 11/1/2024 2:21 PM, Clément Péron wrote:
> The Producer Reference time contains the source time when the frame
> has been produced. This is usefull in the muxer so propagate it.
> 
> Signed-off-by: Clément Péron <peron.clem at gmail.com>
> ---
>   libavcodec/rawenc.c | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
> 
> diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c
> index 8c577006d9..f238c8e165 100644
> --- a/libavcodec/rawenc.c
> +++ b/libavcodec/rawenc.c
> @@ -49,6 +49,8 @@ static av_cold int raw_encode_init(AVCodecContext *avctx)
>   static int raw_encode(AVCodecContext *avctx, AVPacket *pkt,
>                         const AVFrame *frame, int *got_packet)
>   {
> +    AVFrameSideData *side_data;
> +
>       int ret = av_image_get_buffer_size(frame->format,
>                                          frame->width, frame->height, 1);
>   
> @@ -78,6 +80,16 @@ static int raw_encode(AVCodecContext *avctx, AVPacket *pkt,
>           }
>       }
>       *got_packet = 1;
> +
> +    // Forward the PRFT to Mux
> +    side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_PRFT);

What generated this side data? Blindly passing it through doesn't seem 
like a good idea. An encoder should only generate one with a timestamp 
for when the frame finished encoding, or when the frame was first 
submitted to the encoder, but not bypass some value from some unknown 
source blindly.

If what you want is a timestamp from when an encoder produced output, 
then it should be added to the generic code in encode.c, after the 
receive_packet() call, and attached to the output packet. If you want 
one for when the frame was first fed to the encoder, then before 
receive_packet() (and probably stored somewhere to be attached after the 
packet is generated).
There's no need for a prft frame side data for this.

> +    if (side_data && side_data->size) {
> +        uint8_t *buf = av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, side_data->size);
> +        if (!buf)
> +            return AVERROR(ENOMEM);
> +        memcpy(buf, side_data->data, side_data->size);
> +    }
> +
>       return 0;
>   }
>   

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20241129/dadef1a6/attachment.sig>


More information about the ffmpeg-devel mailing list