[FFmpeg-devel] [PATCH 1/3] avformat/matroskaenc: Don't use stream side-data size

James Almer jamrial at gmail.com
Fri May 22 06:31:59 EEST 2020


On 5/21/2020 10:24 PM, Andreas Rheinhardt wrote:
> av_stream_get_side_data() tells the caller whether a stream has side
> data of a specific type; if present it can also tell the caller the size
> of the side data via an optional argument. The Matroska muxer always
> used this optional argument, although it doesn't really need the size,
> as the relevant side-data are not buffers, but structures. So change
> this.
> 
> Furthermore, relying on the size also made the code susceptible to
> a quirk of av_stream_get_side_data(): It only sets the size argument if
> it found side data of the desired type.

Sounds like something that should be fixed instead.
av_packet_get_side_data() sets the size argument to 0 if it doesn't find
the requested side data type. This function should do the same.

> mkv_write_video_color() checks
> for side-data twice with the same variable for the size without resetting
> the size in between; if the second type of side-data isn't present, the
> size will still be what it was after the first call. This was not
> dangerous in practice, as the check for the existence of the second
> side-data compared the size with the expected size, so it would only be
> problematic if lots of elements were to be added to AVContentLightMetadata.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavformat/matroskaenc.c | 19 ++++++++-----------
>  1 file changed, 8 insertions(+), 11 deletions(-)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index fccfee539a..f5968c17b4 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -835,7 +835,6 @@ static void mkv_write_video_color(AVIOContext *pb, const AVStream *st,
>       * plus another byte to stay clear of the end. */
>      uint8_t colour[(2 + 1 + 8) * 18 + (2 + 1) + 1];
>      AVIOContext buf, *dyn_cp = &buf;
> -    int side_data_size = 0;
>      int colorinfo_size;
>      const uint8_t *side_data;
>  
> @@ -868,8 +867,8 @@ static void mkv_write_video_color(AVIOContext *pb, const AVStream *st,
>      }
>  
>      side_data = av_stream_get_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
> -                                        &side_data_size);
> -    if (side_data_size) {
> +                                        NULL);
> +    if (side_data) {
>          const AVContentLightMetadata *metadata =
>              (const AVContentLightMetadata*)side_data;
>          put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORMAXCLL,  metadata->MaxCLL);
> @@ -877,8 +876,8 @@ static void mkv_write_video_color(AVIOContext *pb, const AVStream *st,
>      }
>  
>      side_data = av_stream_get_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
> -                                        &side_data_size);
> -    if (side_data_size == sizeof(AVMasteringDisplayMetadata)) {
> +                                        NULL);
> +    if (side_data) {
>          ebml_master meta_element = start_ebml_master(
>              dyn_cp, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 10 * (2 + 1 + 8));
>          const AVMasteringDisplayMetadata *metadata =
> @@ -919,14 +918,13 @@ static void mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb,
>                                         const AVStream *st)
>  {
>      ebml_master projection;
> -    int side_data_size = 0;
>      uint8_t private[20];
>  
>      const AVSphericalMapping *spherical =
>          (const AVSphericalMapping *)av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL,
> -                                                            &side_data_size);
> +                                                            NULL);
>  
> -    if (!side_data_size)
> +    if (!spherical)
>          return;
>  
>      if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR      &&
> @@ -1028,7 +1026,6 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb,
>      const AVDictionaryEntry *tag;
>      MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
>      const AVStereo3D *stereo;
> -    int side_data_size = 0;
>  
>      *h_width = 1;
>      *h_height = 1;
> @@ -1052,8 +1049,8 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb,
>      }
>  
>      stereo = (const AVStereo3D*)av_stream_get_side_data(st, AV_PKT_DATA_STEREO3D,
> -                                                        &side_data_size);
> -    if (side_data_size >= sizeof(AVStereo3D)) {
> +                                                        NULL);
> +    if (stereo) {
>          switch (stereo->type) {
>          case AV_STEREO3D_2D:
>              format = MATROSKA_VIDEO_STEREOMODE_TYPE_MONO;
> 



More information about the ffmpeg-devel mailing list