]> git.sesse.net Git - casparcg/blobdiff - modules/ffmpeg/producer/audio/audio_decoder.cpp
2.0. Implemented frame-accurate auto play functionality which also takes into account...
[casparcg] / modules / ffmpeg / producer / audio / audio_decoder.cpp
index 5b68bb558a7cabf94f1f08fe011018e466dc976c..3cd99a38f685aac411bf01c348a98c484f15b1f1 100644 (file)
@@ -51,9 +51,12 @@ struct audio_decoder::implementation : boost::noncopyable
        std::vector<int8_t,  tbb::cache_aligned_allocator<int8_t>>      buffer2_;\r
        std::vector<int16_t, tbb::cache_aligned_allocator<int16_t>>     audio_samples_; \r
        std::queue<std::shared_ptr<AVPacket>>                                           packets_;\r
+\r
+       int64_t                                                                                                         nb_frames_;\r
 public:\r
        explicit implementation(const std::shared_ptr<AVFormatContext>& context, const core::video_format_desc& format_desc) \r
                : format_desc_(format_desc)     \r
+               , nb_frames_(0)\r
        {                          \r
                AVCodec* dec;\r
                index_ = av_find_best_stream(context.get(), AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0);\r
@@ -67,6 +70,10 @@ public:
                                \r
                codec_context_.reset(context->streams[index_]->codec, avcodec_close);\r
 \r
+               //nb_frames_ = context->streams[index_]->nb_frames;\r
+               //if(nb_frames_ == 0)\r
+               //      nb_frames_ = context->streams[index_]->duration * context->streams[index_]->time_base.den;\r
+\r
                if(codec_context_ &&\r
                   (codec_context_->sample_rate != static_cast<int>(format_desc_.audio_sample_rate) || \r
                    codec_context_->channels    != static_cast<int>(format_desc_.audio_channels)) ||\r
@@ -175,4 +182,5 @@ audio_decoder::audio_decoder(const std::shared_ptr<AVFormatContext>& context, co
 void audio_decoder::push(const std::shared_ptr<AVPacket>& packet){impl_->push(packet);}\r
 bool audio_decoder::ready() const{return impl_->ready();}\r
 std::vector<std::shared_ptr<std::vector<int16_t>>> audio_decoder::poll(){return impl_->poll();}\r
+int64_t audio_decoder::nb_frames() const{return impl_->nb_frames_;}\r
 }
\ No newline at end of file