[FFmpeg-devel] libavformat/mpegtsenc: new interleaved mux mode [v3]
Marton Balint
cus at passwd.hu
Wed Aug 28 01:46:40 EEST 2019
On Mon, 26 Aug 2019, Andreas Håkon wrote:
> Hi,
>
> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
> On Monday, 19 de August de 2019 21:16, Andreas Håkon <andreas.hakon at protonmail.com> wrote:
>
>> Hi,
>>
>> This is the third version of my patch for an "interleaved MPEG-TS muxer".
>> This new version includes all recommendations and rebases the fix of the
>> incorrect PCR with multiple programs (fixed in collaboration with Marton Balint).
>>
>> Supersedes: https://patchwork.ffmpeg.org/patch/13745/
>>
>> How to check it:
>>
>> (Note: I use for all the tests the file
>> https://samples.ffmpeg.org/HDTV/bshi01.tp
>> )
>>
>> - To check the new interlaced mode you can perform this other test:
>>
>> $ ffmpeg-patched -y -loglevel verbose -i bshi01.tp \
>> -map "i:0x100" -c:0 copy \
>> -map "i:0x110" -c:a:0 mp2 -ac:0 2 -ar:0 48000 -ab:0 384k \
>> -map "i:0x130" -c:2 copy \
>> -map "i:0x110" -c:3 copy \
>> -map "i:0x100" -c:4 copy \
>> -program title=Prog1:st=0:st=1:st=2 \
>> -program title=Prog2:st=3:st=4 \
>> -f mpegts -muxrate 44M -mpegts_extra_mux 1 bshi01-mode1.ts
>>
>> $ ffmpeg-patched -y -loglevel verbose -i bshi01.tp \
>> -map "i:0x100" -c:0 copy \
>> -map "i:0x110" -c:a:0 mp2 -ac:0 2 -ar:0 48000 -ab:0 384k \
>> -map "i:0x130" -c:2 copy \
>> -map "i:0x110" -c:3 copy \
>> -map "i:0x100" -c:4 copy \
>> -program title=Prog1:st=0:st=1:st=2 \
>> -program title=Prog2:st=3:st=4 \
>> -f mpegts -muxrate 44M -mpegts_extra_mux 0 bshi01-mode0.ts
>>
>> ---
>
> To understand what this patch is doing, see these screenshots about the test files
> "bshi01-mode0.ts" and "bshi01-mode1.ts":
>
> - Current muxing: https://trac.ffmpeg.org/attachment/ticket/8096/MODE-0.PNG
> - New interleaved muxing mode: https://trac.ffmpeg.org/attachment/ticket/8096/MODE-1.PNG
>
> See also this example of a professional muxer: https://trac.ffmpeg.org/attachment/ticket/8096/MPTS.PNG
Thanks for your changes, it was much easier for me to see what is going
on. There is still room for simplification, you can probably factorize the
patch which assigns ->stream_id to the context to a sperate patch. And you
can probably loose most of the PES flags you introduced because the
state of the PES packet can be decided based on payload_top and
payload_size. This also helps you to reduce the number of functions added.
The biggest issue however is that your interleaving algorithm works by
draining pending PES packets in a round robin fashion TS packet by TS
packet. So if you have streams A, B, and stream B has twice the bitrate of
stream A, you will get something like this: ABABABBBB when in fact you
should be getting something like ABBABBABB. So I am not sure if we should
add an "interleaving" mode if it only works properly for streams with
roughly the same bitrate. It certainly does not fix ticket #912.
Even if we don't want to implement a "proper" muxer, there should be a way
to improve the interleaving algorightm to have a better chance of
outputting something that is spec compliant. I might give it a try.
Regards,
Marton
More information about the ffmpeg-devel
mailing list