Posts: 750
Threads: 72
Joined: Feb 2020
Hello Selur,
It could be useful, to add the possibility to include in a mkv container the script used by Hybrid (if any) to generate the movie.
x265 is already doing this, are missing the parameters used by other encoders (like nvenc) and the script.
What do you think ?
Dan
Posts: 10.598
Threads: 57
Joined: May 2017
19.09.2024, 20:08
(This post was last modified: 19.09.2024, 20:13 by Selur.)
x264 and x265 (optional) write their encoding settings into the SEI infos of the video stream, other encoder do not.
Under which tag (see: https://www.matroska.org/technical/tagging.html) should these be added?
(ENCODER_SETTINGS ?)
Cu Selur
Ps.: Going to bed now, but I'll think about it.
PPs.: no clue who tools like mediainfo will show this tag isn't just a one-liner, i.e. contains a script.
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Posts: 750
Threads: 72
Joined: Feb 2020
Hybrid is already able to produce a report of all the encoding process (including the script): Config->Internals->Create report file.
It should be enough to add the option to add it as attachment in the mkv container.
Optionally (if it is not too complex).
It could be useful to fill the tags:
ENCODER [UTF-8] : The software used to encode the video
ENCODER_SETTINGS [UTF-8] : A list of the settings used for encoding the video (could be just the list of parameter passed to encoder)
Thanks,
Dan
Posts: 10.598
Threads: 57
Joined: May 2017
ENCODER would always be Hybrid.
And like I wrote the ENCODER_SETTINGS might just be output in a single long string by tools like mediainfo,..
Small test, showed as expected:
Encoding settings : VAPOURRSYNTH SCRIPT USED: / # Imports / import vapoursynth as vs / # getting Vapoursynth core / import sys / import os / core = vs.core / # Import scripts folder / scriptPath = 'f:/Hybrid/64bit/vsscripts' / sys.path.insert(0, os.path.abspath(scriptPath)) / # loading plugins / core.std.LoadPlugin(path="f:/Hybrid/64bit/vsfilters/Support/fmtconv.dll") / core.std.LoadPlugin(path="f:/Hybrid/64bit/vsfilters/MiscFilter/MiscFilters/MiscFilters.dll") / core.std.LoadPlugin(path="f:/Hybrid/64bit/vsfilters/SourceFilter/LSmashSource/LSMASHSource.dll") / # Import scripts / import validate / # Source: 'D:\PProjects\colormnet\tests\thing2.mp4' / # Current color space: YUV420P8, bit depth: 8, resolution: 384x280, frame rate: 25fps, scanorder: progressive, yuv luminance scale: limited, matrix: 709, format: AVC / # Loading D:\PProjects\colormnet\tests\thing2.mp4 using LWLibavSource / clip = core.lsmas.LWLibavSource(source="thing2.mp4", format="YUV420P8", stream_index=0, cache=0, fpsnum=25, prefer_hw=0) / frame = clip.get_frame(0) / # setting color matrix to 709. / clip = core.std.SetFrameProps(clip, _Matrix=vs.MATRIX_BT709) / # setting color transfer (vs.TRANSFER_BT601), if it is not set. / if validate.transferIsInvalid(clip): / clip = core.std.SetFrameProps(clip=clip, _Transfer=vs.TRANSFER_BT601) / # setting color primaries info (to vs.PRIMARIES_BT470_BG), if it is not set. / if validate.primariesIsInvalid(clip): / clip = core.std.SetFrameProps(clip=clip, _Primaries=vs.PRIMARIES_BT470_BG) / # setting color range to TV (limited) range. / clip = core.std.SetFrameProps(clip=clip, _ColorRange=vs.RANGE_LIMITED) / # making sure frame rate is set to 25fps / clip = core.std.AssumeFPS(clip=clip, fpsnum=25, fpsden=1) / # making sure the detected scan type is set (detected: progressive) / clip = core.std.SetFrameProps(clip=clip, _FieldBased=vs.FIELD_PROGRESSIVE) # progressive / # changing range from limited to full range for vsDeOldify / clip = core.resize.Bicubic(clip, range_in_s="limited", range_s="full") / # setting color range to PC (full) range. / clip = core.std.SetFrameProps(clip=clip, _ColorRange=vs.RANGE_FULL) / # adjusting color space from YUV420P8 to RGB24 for vsDeOldify / clip = core.resize.Bicubic(clip=clip, format=vs.RGB24, matrix_in_s="709", range_s="full") / # adding colors using DeOldify / from vsdeoldify import HAVC_deepex / clip = HAVC_deepex(clip=clip, method=4, ref_merge=0, dark=True, smooth=False, max_memory_frames=8, /
sc_framedir="ref", ex_model=0, encode_mode=1) / # changing range from full to limited range for vsDeOldify / clip = core.resize.Bicubic(clip, range_in_s="full", range_s="limited") / # no resizing since resolution is already archived / # adjusting output color from: RGB24 to YUV420P10 for x265Model / clip = core.resize.Bicubic(clip=clip, format=vs.YUV420P10, matrix_s="709", range_s="limited") / # set output frame rate to 25fps (progressive) / clip = core.std.AssumeFPS(clip=clip, fpsnum=25, fpsden=1) / # output / clip.set_output()
So may be adding a tag might not be the best choice.
Quote:Optionally (if it is not too complex).
Not really complex, just not really usable int the output.
Quote:It should be enough to add the option to add it as attachment in the mkv container.
Adding the report to the mkv as an attachment is probably easy.
--attachment-description "Hybrids report file" \
--attachment-mime-typetext/plain \
--attach-file "PATH to reportfile"
n8
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Posts: 750
Threads: 72
Joined: Feb 2020
I understood, I do agree that adding the report file as attachment it is the best option.
Thanks,
Dan
Posts: 10.598
Threads: 57
Joined: May 2017
Okay, this is more complicated than I would have thought, since I didn't think about what this would require.
Message processing is separated from job processing and all the other stuff.
So DebugOutput and Report creation are independent of job processing.
(Both can be turned off and on during job processing, without influencing the job processing.)
Adding the report isn't possible without major changes, which would break 'separation of concern' in the code, which I will not do.
(Hybrid's internal logic and dependencies are complicated/bad enough as they are; ~250k lines of code.)
So Hybrid would need to create a separate file before the muxing call, which includes all the wanted data and that could be added to the muxing call.
But have you ever checked how normal media players handle unknown mkv text attachments?
And how do you plan to look at the attachment?
The only thing that pops into my mind would be to extract the file with mkvextract and then look at it, but then simply using the report file as a separate file is probably more convenient.
=> atm. keeping the normal report file seems to be the most sensible solution.
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
|