X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fffmpeg_examiner.cc;h=c09395e76609086f33579b63b18c008cf4cc3744;hp=e5d356a27b7b213ffeaaa2a04f6e09f9c168ca94;hb=46cd0fe7b5b514f0d9456b25f670679cc584a218;hpb=f1bf21a9c2581591ab80bfc997a22b93046f8c56 diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index e5d356a27..c09395e76 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -25,8 +25,10 @@ extern "C" { #include "ffmpeg_content.h" using std::string; +using std::cout; using std::stringstream; using boost::shared_ptr; +using boost::optional; FFmpegExaminer::FFmpegExaminer (shared_ptr c) : FFmpeg (c) @@ -56,6 +58,61 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c) } } + /* Run through until we find the first audio (for each stream) and video */ + + while (1) { + int r = av_read_frame (_format_context, &_packet); + if (r < 0) { + break; + } + + int frame_finished; + avcodec_get_frame_defaults (_frame); + + cout << "got packet " << _packet.stream_index << "\n"; + + AVCodecContext* context = _format_context->streams[_packet.stream_index]->codec; + + if (_packet.stream_index == _video_stream && !_first_video) { + if (avcodec_decode_video2 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) { + _first_video = frame_time (_video_stream); + } + } else { + for (size_t i = 0; i < _audio_streams.size(); ++i) { + if (_packet.stream_index == _audio_streams[i]->id && !_audio_streams[i]->start) { + if (avcodec_decode_audio4 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) { + _audio_streams[i]->start = frame_time (_audio_streams[i]->id); + } + } + } + } + + bool have_all_audio = true; + size_t i = 0; + while (i < _audio_streams.size() && have_all_audio) { + have_all_audio = _audio_streams[i]->start; + ++i; + } + + if (_first_video && have_all_audio) { + break; + } + + av_free_packet (&_packet); + } +} + +optional