MOV and ProRes Metadata Tags

  • Hello! First of all, I want to say thank you so much to all you fine folks for making such a wonderful program!

    I know that Voukoder is build on Libav and not actually built on ffmpeg. However, I'm only familiar with ffmpeg, so I'll need to use ffmpeg commands as examples to demonstrate the problem.

    MOV files handle color space tags and other metadata in a strange way. When one uses the setparams filter or similar, color tags are not actually written to the output file. Instead, MOV needs the write_colr flag (which ffmpeg considers to be experimental) and the prores_metadata bitstream filter. I believe that both of these need to be used to properly write color space tags to ProRes MOV files.

    Currently, I set Resolve Studio to VoukoderPro YUV444(16 bit) with Interlaced Rendering turned on and set to bottom field first. I have a scene in VoukoderPro set for:

    Video Input >
    > Video Filter Field Order (Bottom Field First) >
    > Video Filter Set Params (Mark as bottom field first, mpeg, smpte170m, smpte170m, smpte170m) >
    > ProRes_KS (yuv422pp10le, 8, Hq, apl0, 8000, Auto, 0) >
    > Muxer MOV (default values) >
    > Output to File

    Audio Input >
    > Audio Encoder S24LE (s32) >
    > Same MOV muxer and output file as video

    The resulting file gives the following output from ffprobe:

    There are several problems here. All color tags are listed as unknown, despite Set Params being used. The file is also falsely tagged as progressive and not interlaced (but the footage is indeed properly interlaced. Only the tag is wrong.). Lastly, vendor is being reported as "FFMP" and not the specified vendor "apl0".

    When I take that file and run it through the following ffmpeg command, many of the problems are solved:

    Code
    ffmpeg -i in.mov -c copy -vendor apl0 -bsf:v prores_metadata=color_primaries=smpte170m:color_trc=bt709:colorspace=smpte170m -colorspace smpte170m -color_primaries smpte170m -color_trc bt709 -color_range tv -field_order bt -movflags +write_colr -strict experimental out.mov

    The resulting ffprobe data from this is:

    This fixes the color tags except color_range. I'm not sure how to get it to properly set color range. I found this documentation on color tags and color range, and it outlines two color schemes for full range and video range, but it doesn't seem to say how they are tagged in the file. Maybe I'm missing something? https://developer.apple.com/documentation/…_parameter_atom

    Additionally, the field_order tag is corrected, but the vendor tag remains incorrect.

    Lastly, interestingly ffmpeg switches the order of the streams around. I normally keep video as stream 0 and audio as stream 1, but I'm not sure if this actually ever matters in practice. I just thought it was interesting to note.

    Would it be possible for Voukoder to do the following:

    1) Have the option to write the colr atom to MOV files

    2) Have the option to apply the prores_metadata bit stream filter to prores_ks (and maybe to the other ProRes encoders?)

    3) Fix the vendor tag to properly reflect what is defined in the prores_ks encoder (apl0 in my case)

    4) Fix the field_order tag to get the proper value from Set Params or the Field Order filter.

    Thank you all so much! Please let me know if you have any questions or need further clarification on anything! I'm happy to help however I can.

  • Vouk 26. Oktober 2024 um 07:17

    Hat das Thema freigeschaltet.
    • Offizieller Beitrag

    Thanks for this detailed analytics. My replies refer to: https://ffmpeg.org/doxygen/trunk/…_accessors.html

    1) I need to access the color information from the filter chain. The methods av_buffersink_get_color_range() and av_buffersink_get_colorspace() have been added recently (I guess). I'm using them in the next version. But I didn't find the methods av_buffersink_get_color_primaries() and av_buffersink_get_color_trc() yet. I have asked the libav devs.

    3) The vendor tag should be written correctly (as reported in MediaInfo)

    4) I'd also need a method to access the field order of the resulting frames. There are filters to change field order or even deinterlace filters. So I guess I'd need that buffersink_get method to get the final field order. Currently this is hardcoded to "progressive".