Fix confusion about subtitle codec pointers.
authorCarl Hetherington <cth@carlh.net>
Fri, 27 Jun 2014 10:16:37 +0000 (11:16 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 27 Jun 2014 10:16:37 +0000 (11:16 +0100)
src/lib/ffmpeg.cc
src/lib/ffmpeg.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_decoder.h

index 8505626df1013a980cf6d100fb4246cb147cc302..f5af239b0a0eeba9445d85a98fbe97c767ae9658 100644 (file)
@@ -26,6 +26,7 @@ extern "C" {
 #include "ffmpeg.h"
 #include "ffmpeg_content.h"
 #include "ffmpeg_audio_stream.h"
+#include "ffmpeg_subtitle_stream.h"
 #include "exceptions.h"
 #include "util.h"
 
@@ -174,6 +175,16 @@ FFmpeg::audio_codec_context () const
        return _ffmpeg_content->audio_stream()->stream(_format_context)->codec;
 }
 
+AVCodecContext *
+FFmpeg::subtitle_codec_context () const
+{
+       if (!_ffmpeg_content->subtitle_stream ()) {
+               return 0;
+       }
+       
+       return _ffmpeg_content->subtitle_stream()->stream(_format_context)->codec;
+}
+
 int
 FFmpeg::avio_read (uint8_t* buffer, int const amount)
 {
index 1d2c312e6d528c181ec8e5ee3d9ef6c1566bf95f..8aaa54f84afab6973938e83eb138a60d6a2fa9c3 100644 (file)
@@ -56,6 +56,7 @@ public:
 protected:
        AVCodecContext* video_codec_context () const;
        AVCodecContext* audio_codec_context () const;
+       AVCodecContext* subtitle_codec_context () const;
        
        boost::shared_ptr<const FFmpegContent> _ffmpeg_content;
 
index 2041a4d17aa6433d10548473898b8a813a75bdb8..42be8227e95e57ebd0481e5b500566b1fd6cafb4 100644 (file)
@@ -70,8 +70,6 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log>
        , SubtitleDecoder (c)
        , FFmpeg (c)
        , _log (log)
-       , _subtitle_codec_context (0)
-       , _subtitle_codec (0)
 {
        /* Audio and video frame PTS values may not start with 0.  We want
           to fiddle them so that:
@@ -106,15 +104,6 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log>
        }
 }
 
-FFmpegDecoder::~FFmpegDecoder ()
-{
-       boost::mutex::scoped_lock lm (_mutex);
-
-       if (_subtitle_codec_context) {
-               avcodec_close (_subtitle_codec_context);
-       }
-}
-
 void
 FFmpegDecoder::flush ()
 {
@@ -382,8 +371,8 @@ FFmpegDecoder::seek_and_flush (ContentTime t)
        if (audio_codec_context ()) {
                avcodec_flush_buffers (audio_codec_context ());
        }
-       if (_subtitle_codec_context) {
-               avcodec_flush_buffers (_subtitle_codec_context);
+       if (subtitle_codec_context ()) {
+               avcodec_flush_buffers (subtitle_codec_context ());
        }
 }
 
@@ -508,7 +497,7 @@ FFmpegDecoder::decode_subtitle_packet ()
 {
        int got_subtitle;
        AVSubtitle sub;
-       if (avcodec_decode_subtitle2 (_subtitle_codec_context, &sub, &got_subtitle, &_packet) < 0 || !got_subtitle) {
+       if (avcodec_decode_subtitle2 (subtitle_codec_context(), &sub, &got_subtitle, &_packet) < 0 || !got_subtitle) {
                return;
        }
 
index 335364d2e18bdacfce192b3a0366ec546f408c3d..2859e23450380f7f9435a31f676cf5aa2ca1c58f 100644 (file)
@@ -48,7 +48,6 @@ class FFmpegDecoder : public VideoDecoder, public AudioDecoder, public SubtitleD
 {
 public:
        FFmpegDecoder (boost::shared_ptr<const FFmpegContent>, boost::shared_ptr<Log>);
-       ~FFmpegDecoder ();
 
 private:
        friend class ::ffmpeg_pts_offset_test;
@@ -75,8 +74,6 @@ private:
        bool has_subtitle_during (ContentTimePeriod) const;
        
        boost::shared_ptr<Log> _log;
-       AVCodecContext* _subtitle_codec_context; ///< may be 0 if there is no subtitle
-       AVCodec* _subtitle_codec;                ///< may be 0 if there is no subtitle
        
        std::list<boost::shared_ptr<FilterGraph> > _filter_graphs;
        boost::mutex _filter_graphs_mutex;