Remove Image::clone in favour of a copy constructor for SimpleImage; clean up A/B...
authorCarl Hetherington <cth@carlh.net>
Thu, 25 Apr 2013 12:44:02 +0000 (13:44 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 25 Apr 2013 12:44:02 +0000 (13:44 +0100)
src/lib/ab_transcoder.cc
src/lib/combiner.cc
src/lib/encoder.cc
src/lib/image.cc
src/lib/image.h
src/lib/transcoder.cc

index 26643b50edd5d3b936c1d970ae8af748faef9da3..d8f13dae4b7854afb0b1f4d97c70ab488f78ff2c 100644 (file)
@@ -122,25 +122,21 @@ ABTranscoder::go ()
                } else {
                        done[2] = true;
                }
-
+               
                if (_job) {
                        _da.video->set_progress (_job);
                }
-
+               
                if (done[0] && done[1] && done[2]) {
                        break;
                }
        }
-
-       if (_delay_line) {
-               _delay_line->process_end ();
-       }
+               
+       _delay_line->process_end ();
        if (_matcher) {
                _matcher->process_end ();
        }
-       if (_gain) {
-               _gain->process_end ();
-       }
+       _gain->process_end ();
        _encoder->process_end ();
 }
                            
index 250528aeb91e61d1b4bcd47a20406528e6976927..367cefa7f49fead4aa824798143fbf237dbeed74 100644 (file)
@@ -35,7 +35,7 @@ Combiner::Combiner (shared_ptr<Log> log)
 void
 Combiner::process_video (shared_ptr<const Image> image, bool, shared_ptr<Subtitle>, double)
 {
-       _image = image->clone ();
+       _image.reset (new SimpleImage (image));
 }
 
 /** Process video for the right half of the frame.
@@ -50,15 +50,14 @@ Combiner::process_video_b (shared_ptr<const Image> image, bool, shared_ptr<Subti
        for (int i = 0; i < image->components(); ++i) {
                int const line_size = image->line_size()[i];
                int const half_line_size = line_size / 2;
-               int const stride = image->stride()[i];
 
                uint8_t* p = _image->data()[i];
                uint8_t* q = image->data()[i];
                        
                for (int j = 0; j < image->lines (i); ++j) {
                        memcpy (p + half_line_size, q + half_line_size, half_line_size);
-                       p += stride;
-                       q += stride;
+                       p += _image->stride()[i];
+                       q += image->stride()[i];
                }
        }
 
index 7a1eea0698df8b915471ee34ccfef67f2cc7dbcf..cff9899acb6151cc19990f372c0a091c7d63968f 100644 (file)
@@ -333,7 +333,9 @@ Encoder::terminate_threads ()
        lock.unlock ();
 
        for (list<boost::thread *>::iterator i = _threads.begin(); i != _threads.end(); ++i) {
-               (*i)->join ();
+               if ((*i)->joinable ()) {
+                       (*i)->join ();
+               }
                delete *i;
        }
 }
index 9bcbb87ab3cc6b9d2c71a523beeb35e9be193bd0..1be41fecf880dffaaa5f8ddbfafd20ec5296e175 100644 (file)
@@ -509,7 +509,33 @@ SimpleImage::SimpleImage (SimpleImage const & other)
        allocate ();
 
        for (int i = 0; i < components(); ++i) {
-               memcpy (_data[i], other._data[i], _line_size[i] * lines(i));
+               uint8_t* p = _data[i];
+               uint8_t* q = other._data[i];
+               for (int j = 0; j < lines(i); ++j) {
+                       memcpy (p, q, _line_size[i]);
+                       p += stride()[i];
+                       q += other.stride()[i];
+               }
+       }
+}
+
+SimpleImage::SimpleImage (shared_ptr<const Image> other)
+       : Image (*other.get())
+{
+       _size = other->size ();
+       _aligned = true;
+
+       allocate ();
+
+       for (int i = 0; i < components(); ++i) {
+               assert(line_size()[i] == other->line_size()[i]);
+               uint8_t* p = _data[i];
+               uint8_t* q = other->data()[i];
+               for (int j = 0; j < lines(i); ++j) {
+                       memcpy (p, q, line_size()[i]);
+                       p += stride()[i];
+                       q += other->stride()[i];
+               }
        }
 }
 
@@ -583,12 +609,6 @@ SimpleImage::aligned () const
        return _aligned;
 }
 
-shared_ptr<Image>
-SimpleImage::clone () const
-{
-       return shared_ptr<Image> (new SimpleImage (*this));
-}
-
 FilterBufferImage::FilterBufferImage (AVPixelFormat p, AVFilterBufferRef* b)
        : Image (p)
        , _buffer (b)
index 31035d272d99a33f4791ff210d0cff23db47e991..62961a92e12d56cd5d9ac658bb12d1c47e27658d 100644 (file)
@@ -70,8 +70,6 @@ public:
 
        virtual bool aligned () const = 0;
 
-       virtual boost::shared_ptr<Image> clone () const = 0;
-
        int components () const;
        int lines (int) const;
 
@@ -120,9 +118,6 @@ private:
        /* Not allowed */
        FilterBufferImage (FilterBufferImage const &);
        FilterBufferImage& operator= (FilterBufferImage const &);
-       boost::shared_ptr<Image> clone () const {
-               assert (false);
-       }
        
        AVFilterBufferRef* _buffer;
        int* _line_size;
@@ -136,6 +131,7 @@ class SimpleImage : public Image
 public:
        SimpleImage (AVPixelFormat, libdcp::Size, bool);
        SimpleImage (SimpleImage const &);
+       SimpleImage (boost::shared_ptr<const Image>);
        SimpleImage& operator= (SimpleImage const &);
        ~SimpleImage ();
 
@@ -144,7 +140,6 @@ public:
        int * stride () const;
        libdcp::Size size () const;
        bool aligned () const;
-       boost::shared_ptr<Image> clone () const;
 
 protected:
        void allocate ();
index 4d3f29e83010b13ef39100f1f5f6c9cc3bb327c4..faafcaf8b593821fd6b5600f82f48b758192eeba 100644 (file)
@@ -103,31 +103,26 @@ void
 Transcoder::go ()
 {
        _encoder->process_begin ();
-       try {
-               bool done[2] = { false, false };
-               
-               while (1) {
-                       if (!done[0]) {
-                               done[0] = _decoders.video->pass ();
-                               if (_job) {
-                                       _decoders.video->set_progress (_job);
-                               }
-                       }
-
-                       if (!done[1] && _decoders.audio && dynamic_pointer_cast<Decoder> (_decoders.audio) != dynamic_pointer_cast<Decoder> (_decoders.video)) {
-                               done[1] = _decoders.audio->pass ();
-                       } else {
-                               done[1] = true;
-                       }
 
-                       if (done[0] && done[1]) {
-                               break;
+       bool done[2] = { false, false };
+       
+       while (1) {
+               if (!done[0]) {
+                       done[0] = _decoders.video->pass ();
+                       if (_job) {
+                               _decoders.video->set_progress (_job);
                        }
                }
                
-       } catch (...) {
-               _encoder->process_end ();
-               throw;
+               if (!done[1] && _decoders.audio && dynamic_pointer_cast<Decoder> (_decoders.audio) != dynamic_pointer_cast<Decoder> (_decoders.video)) {
+                       done[1] = _decoders.audio->pass ();
+               } else {
+                       done[1] = true;
+               }
+               
+               if (done[0] && done[1]) {
+                       break;
+               }
        }
        
        _delay_line->process_end ();