• Marton Balint's avatar
    avformat/mpegtsenc: fix incorrect PCR selection with multiple programs · d770e0f4
    Marton Balint authored
    The MPEG-TS muxer had a serious bug related to the use of multiple programs:
    in that case, the PCR pid selection was incomplete for all services except one.
    This patch solves this problem and selects a stream to become PCR for each
    service, preferably the video stream.
    
    This patch also moves pcr calculation attributes to MpegTSWriteStream from
    MpegTSService. PCR is a per-stream and not per-service thing, so it was
    misleading to refer to it as something that is per-service.
    
    Also remove *service from MpegTSWriteStream because a stream can belong to
    multiple services so it was misleading to select one for each stream.
    
    You can check the result with this example command:
    
    ./ffmpeg -loglevel verbose -y -f lavfi -i \
      "testsrc=s=64x64:d=10,split=2[out0][tmp1];[tmp1]vflip[out1];sine=d=10,asetnsamples=1152[out2]" \
      -flags +bitexact -fflags +bitexact -sws_flags +accurate_rnd+bitexact  \
      -codec:v libx264 -codec:a mp2 -pix_fmt yuv420p \
      -map '0:v:0' \
      -map '0:v:1' \
      -map '0:a:0'  \
      -program st=0:st=2 -program st=1:st=2 -program st=2 -program st=0 -f mpegts out.ts
    
    You should now see this:
    
    [mpegts @ 0x37505c0] service 1 using PCR in pid=256
    [mpegts @ 0x37505c0] service 2 using PCR in pid=257
    [mpegts @ 0x37505c0] service 3 using PCR in pid=258
    [mpegts @ 0x37505c0] service 4 using PCR in pid=256
    
    Fixes ticket #8039.
    
    v2: a video is stream is preferred if there are no programs, just like before
    the patch.
    Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
    d770e0f4
Name
Last commit
Last update
compat Loading commit data...
doc Loading commit data...
ffbuild Loading commit data...
fftools Loading commit data...
libavcodec Loading commit data...
libavdevice Loading commit data...
libavfilter Loading commit data...
libavformat Loading commit data...
libavresample Loading commit data...
libavutil Loading commit data...
libpostproc Loading commit data...
libswresample Loading commit data...
libswscale Loading commit data...
presets Loading commit data...
tests Loading commit data...
tools Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.travis.yml Loading commit data...
CONTRIBUTING.md Loading commit data...
COPYING.GPLv2 Loading commit data...
COPYING.GPLv3 Loading commit data...
COPYING.LGPLv2.1 Loading commit data...
COPYING.LGPLv3 Loading commit data...
CREDITS Loading commit data...
Changelog Loading commit data...
INSTALL.md Loading commit data...
LICENSE.md Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README.md Loading commit data...
RELEASE Loading commit data...
configure Loading commit data...