1. 25 May, 2018 5 commits
  2. 24 May, 2018 6 commits
  3. 22 May, 2018 5 commits
  4. 21 May, 2018 6 commits
  5. 20 May, 2018 8 commits
  6. 19 May, 2018 5 commits
    • Martin Vignali's avatar
    • Martin Vignali's avatar
      644130bc
    • Aman Gupta's avatar
      avformat/mpegts: add merge_pmt_versions option · 16b4f97b
      Aman Gupta authored
      This new optional flag makes it easier to deal with mpegts
      samples where the PMT is updated and elementary streams move
      to different PIDs in the middle of playback.
      
      Previously, new AVStreams were created per PID, and it was up
      to the user to figure out which streams had migrated to a new PID
      (by iterating over the list of AVProgram and making guesses), and
      switch seamlessly to the new AVStream during playback.
      
      Transcoding or remuxing these streams with ffmpeg on the CLI was
      also quite painful, and the user would need to extract each set
      of PIDs into a separate file and then stitch them back together.
      
      With this new option, the mpegts demuxer will automatically detect
      PMT changes and feed data from the new PID to the original AVStream
      that was created for the orignal PID. For mpegts samples with
      stream_identifier_descriptor available, the unique ID is used to
      merge PIDs together. If the stream id is not available, the demuxer
      attempts to map PIDs based on their position within the PMT.
      
      With this change, I am able to playback and transcode/remux these
      two samples which previously caused issues:
      
          https://tmm1.s3.amazonaws.com/pmt-version-change.ts
          https://kuroko.fushizen.eu/videos/pid_switch_sample.ts
      
      I also have another longer sample in which the PMT changes
      repeatedly and ES streams move to different pids three times
      during playback:
      
          https://tmm1.s3.amazonaws.com/multiple-pmt-change.ts
      
      Demuxing this sample with the new option shows several new log
      messages as the PMT changes are handled:
      
          [mpegts] detected PMT change (program=1, version=3/6, pcr_pid=0xf98/0xfb7)
          [mpegts] re-using existing video stream 0 (pid=0xf98) for new pid=0xfb7
          [mpegts] re-using existing audio stream 1 (pid=0xf99) for new pid=0xfb8
          [mpegts] re-using existing audio stream 2 (pid=0xf9a) for new pid=0xfb9
          [mpegts] detected PMT change (program=1, version=6/3, pcr_pid=0xfb7/0xf98)
          [mpegts] detected PMT change (program=1, version=3/4, pcr_pid=0xf98/0xf9b)
          [mpegts] re-using existing video stream 0 (pid=0xf98) for new pid=0xf9b
          [mpegts] re-using existing audio stream 1 (pid=0xf99) for new pid=0xf9c
          [mpegts] re-using existing audio stream 2 (pid=0xf9a) for new pid=0xf9d
          [mpegts] detected PMT change (program=1, version=4/5, pcr_pid=0xf9b/0xfa9)
          [mpegts] re-using existing video stream 0 (pid=0xf98) for new pid=0xfa9
          [mpegts] re-using existing audio stream 1 (pid=0xf99) for new pid=0xfaa
          [mpegts] re-using existing audio stream 2 (pid=0xf9a) for new pid=0xfab
          [mpegts] detected PMT change (program=1, version=5/6, pcr_pid=0xfa9/0xfb7)
      Signed-off-by: 's avatarAman Gupta <aman@tmm1.net>
      16b4f97b
    • Aman Gupta's avatar
      avformat/mpegts: keep track of PMT details in AVProgram/AVStream · 24579bf5
      Aman Gupta authored
      With these fields, the user has enough information to
      detect PMT changes and switch to new streams when the PMT
      is updated with new ES pids.
      
      To do so, the user would monitor the AVProgram they're interested
      in for changes to pmt_version. If the version changes, they would
      iterate over the program's streams to find new streams added with
      the updated version number.
      
      If new versions of streams are found, then the user would first try
      to replace existing streams where stream_identifier matched.
      If stream_identifier is not available, then the user would compare
      pmt_stream_idx instead to replace the stream that was previously
      at the same position within the PMT.
      Signed-off-by: 's avatarAman Gupta <aman@tmm1.net>
      24579bf5
    • Aman Gupta's avatar
      avformat: add fields to AVProgram/AVStream for PMT change tracking · 2b2f2f65
      Aman Gupta authored
      These fields will allow the mpegts demuxer to expose details about
      the PMT/program which created the AVProgram and its AVStreams.
      
      In mpegts, a PMT which advertises streams has a version number
      which can be incremented at any time. When the version changes,
      the pids which correspond to each of it's streams can also change.
      
      Since ffmpeg creates a new AVStream per pid by default, an API user
      needs the ability to (a) detect when the PMT changed, and (b) tell
      which AVStream were added to replace earlier streams.
      
      This has been a long-standing issue with ffmpeg's handling of mpegts
      streams with PMT changes, and I found two related patches in the wild
      that attempt to solve the same problem:
      
      The first is in MythTV's ffmpeg fork, where they added a
      void (*streams_changed)(void*); to AVFormatContext and call it from
      their fork of the mpegts demuxer whenever the PMT changes.
      
      The second was proposed by XBMC in
      https://ffmpeg.org/pipermail/ffmpeg-devel/2012-December/135036.html,
      where they created a new AVMEDIA_TYPE_DATA stream with id=0 and
      attempted to send packets to it whenever the PMT changed.
      Signed-off-by: 's avatarAman Gupta <aman@tmm1.net>
      2b2f2f65
  7. 18 May, 2018 5 commits
    • James Almer's avatar
      79126ce8
    • Aman Gupta's avatar
      avcodec/videotoolbox: fix decoding of some HEVC videos · 8f146b52
      Aman Gupta authored
      In a normal hwaccel, the AVHWFramesContext sets AVFrame.hw_frames_ctx
      when it initializes a new AVFrame in av_hwframe_get_buffer().
      
      But the VT hwaccel doesn't know what hw_frames_ctx to assign when
      the AVFrame is first created, because it depends on the format of
      the pixbuf that the decoder eventually decides to return. Thus
      newly created AVFrames always have a NULL hw_frames_ctx, and the
      hwaccel would only assign the ctx once a frame was done decoding.
      This worked fine with the H264 decoder, but with the HEVC decoder
      the frame's data may be moved to another empty AVFrame. Since the
      empty AVFrame never had hw_frames_ctx set, a frame with a NULL
      ctx could be returned to the API user.
      
      This patch works around the issue by moving the derived
      hw_frames_ctx from the AVFrame to a new VTHWFrame which now holds
      both the CVPixelBufferRef and the AVBuffer. The hw_frames_ctx
      is only copied to the AVFrame right before it is about to be
      returned to the user in videotoolbox_postproc_frame() (since
      in the case of VT, the hw_frames_ctx is only there for the API
      user anyway).
      
      Fixes playback on macOS and iOS of some hevc videos like
      https://s3.amazonaws.com/tmm1/videotoolbox/germany-hevc-zdf.tsSigned-off-by: 's avatarAman Gupta <aman@tmm1.net>
      8f146b52
    • Aman Gupta's avatar
      avformat/mpegts: add skip_unknown_pmt option · e24d768a
      Aman Gupta authored
      Some filtered mpegts streams may erroneously include PMTs for
      programs that are not advertised in the PAT. This confuses ffmpeg
      and most players because multiple audio/video streams are created
      and it is unclear which ones actually contain data.
      
      See for example https://tmm1.s3.amazonaws.com/unknown-pmts.ts
      
      In this sample, the PAT advertises exactly one program. But the
      pid it points to for the program's PMT contains PMTs for other
      programs as well. This is because the broadcaster decided to
      re-use the same pid for multiple program PMTs.
      
      The hardware that filtered the original multi-program stream
      into a single-program stream did so by rewriting the PAT to
      contain only the program that was requested. But since it just
      passed through the PMT pid referenced in the PAT, multiple PMTs
      are still present for the other programs.
      
      Before:
      
          Input #0, mpegts, from 'unknown-pmts.ts':
            Duration: 00:00:10.11, start: 80741.189700, bitrate: 9655 kb/s
            Program 4
              Stream #0:2[0x41]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 11063 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc
              Stream #0:3[0x44](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s
              Stream #0:4[0x45](spa): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 128 kb/s
            No Program
              Stream #0:0[0x31]: Video: mpeg2video ([2][0][0][0] / 0x0002), none(tv), 90k tbr, 90k tbn, 90k tbc
              Stream #0:1[0x34](eng): Audio: ac3 (AC-3 / 0x332D4341), 0 channels, fltp
              Stream #0:5[0x51]: Video: mpeg2video ([2][0][0][0] / 0x0002), none, 90k tbr, 90k tbn
              Stream #0:6[0x54](eng): Audio: ac3 (AC-3 / 0x332D4341), 0 channels
      
      With skip_unknown_pmt=1:
      
          Input #0, mpegts, from 'unknown-pmts.ts':
            Duration: 00:00:10.11, start: 80741.189700, bitrate: 9655 kb/s
            Program 4
              Stream #0:0[0x41]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 11063 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc
              Stream #0:1[0x44](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s
              Stream #0:2[0x45](spa): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 128 kb/s
      Signed-off-by: 's avatarAman Gupta <aman@tmm1.net>
      e24d768a
    • Clément Bœsch's avatar
    • Tobias Rapp's avatar
      avfilter/vsrc_testsrc: add pal75bars and pal100bars video filter sources · eb28b5ec
      Tobias Rapp authored
      Generates color bar test patterns based on EBU PAL recommendations.
      Reviewed-by: 's avatarPaul B Mahol <onemda@gmail.com>
      Signed-off-by: 's avatarTobias Rapp <t.rapp@noa-archive.com>
      eb28b5ec