Untested; extend CompactImage to return a AVPicture.
authorCarl Hetherington <cth@carlh.net>
Mon, 12 Nov 2012 23:45:44 +0000 (23:45 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 12 Nov 2012 23:45:44 +0000 (23:45 +0000)
src/lib/decoder.cc
src/lib/decoder.h
src/lib/filter_graph.cc
src/lib/filter_graph.h
src/lib/image.cc
src/lib/image.h
src/lib/imagemagick_decoder.cc
src/lib/tiff_decoder.cc

index 97f1bc92f5197d1f6472779996f0d37b1bb03159..e91b5e19e739bffb39463ec9021298543a6698c0 100644 (file)
@@ -97,7 +97,7 @@ Decoder::process_audio (shared_ptr<AudioBuffers> audio)
  *  @param frame to decode; caller manages memory.
  */
 void
-Decoder::process_video (AVFrame* frame)
+Decoder::process_video (AVFrame const * frame)
 {
        shared_ptr<FilterGraph> graph;
 
index 71dfed1e0c7768aea8ca99a042e3362361edacd0..a458c348b04e7195aa890ec958058db53a6556cb 100644 (file)
@@ -99,7 +99,7 @@ protected:
        
        virtual PixelFormat pixel_format () const = 0;
        
-       void process_video (AVFrame *);
+       void process_video (AVFrame const *);
        void process_audio (boost::shared_ptr<AudioBuffers>);
        void process_subtitle (boost::shared_ptr<TimedSubtitle>);
        void repeat_last_video ();
index 1418384b85672235aa17cf6291d81ed588b08bdf..72bb8deb771107232bfbb1c198642a78b4d2a5af 100644 (file)
@@ -134,7 +134,7 @@ FilterGraph::FilterGraph (shared_ptr<Film> film, Decoder* decoder, bool crop, Si
 }
 
 list<shared_ptr<Image> >
-FilterGraph::process (AVFrame* frame)
+FilterGraph::process (AVFrame const * frame)
 {
        list<shared_ptr<Image> > images;
        
index 53908738ecd5bf9f3495b8d23b8d8ce690f34db2..4ff10dece1a3dfe996076110dc3c41231eec1344 100644 (file)
@@ -32,7 +32,7 @@ public:
        FilterGraph (boost::shared_ptr<Film> film, Decoder* decoder, bool crop, Size s, AVPixelFormat p);
 
        bool can_process (Size s, AVPixelFormat p) const;
-       std::list<boost::shared_ptr<Image> > process (AVFrame* frame);
+       std::list<boost::shared_ptr<Image> > process (AVFrame const * frame);
 
 private:
        AVFilterContext* _buffer_src_context;
index c8303115b967f4f5c401166eff5077638927d01d..05270954dd6309271efacf30bd00f8f6d4849f5f 100644 (file)
@@ -379,7 +379,7 @@ AlignedImage::AlignedImage (AVPixelFormat f, Size s)
 CompactImage::CompactImage (AVPixelFormat f, Size s)
        : SimpleImage (f, s, boost::bind (round_up, _1, 1))
 {
-
+       setup_picture ();
 }
 
 CompactImage::CompactImage (shared_ptr<Image> im)
@@ -400,6 +400,17 @@ CompactImage::CompactImage (shared_ptr<Image> im)
                        o += im->stride()[c];
                }
        }
+
+       setup_picture ();
+}
+
+void
+CompactImage::setup_picture ()
+{
+       for (int c = 0; c < components(); ++c) {
+               _picture.data[c] = data()[c];
+               _picture.linesize[c] = line_size()[c];
+       }
 }
 
 FilterBufferImage::FilterBufferImage (AVPixelFormat p, AVFilterBufferRef* b)
@@ -439,53 +450,3 @@ FilterBufferImage::size () const
        return Size (_buffer->video->w, _buffer->video->h);
 }
 
-/** XXX: this could be generalised to use any format, but I don't
- *  understand how avpicture_fill is supposed to be called with
- *  multi-planar images.
- */
-RGBFrameImage::RGBFrameImage (Size s)
-       : Image (PIX_FMT_RGB24)
-       , _size (s)
-{
-       _frame = avcodec_alloc_frame ();
-       if (_frame == 0) {
-               throw EncodeError ("could not allocate frame");
-       }
-
-       _data = (uint8_t *) av_malloc (size().width * size().height * 3);
-       avpicture_fill ((AVPicture *) _frame, _data, PIX_FMT_RGB24, size().width, size().height);
-       _frame->width = size().width;
-       _frame->height = size().height;
-       _frame->format = PIX_FMT_RGB24;
-}
-
-RGBFrameImage::~RGBFrameImage ()
-{
-       av_free (_data);
-       av_free (_frame);
-}
-
-uint8_t **
-RGBFrameImage::data () const
-{
-       return _frame->data;
-}
-
-int *
-RGBFrameImage::line_size () const
-{
-       return _frame->linesize;
-}
-
-int *
-RGBFrameImage::stride () const
-{
-       /* XXX? */
-       return line_size ();
-}
-
-Size
-RGBFrameImage::size () const
-{
-       return _size;
-}
index b2b9872792a3815de37a86507203419279edb1ff..bb4a32319e0643f4047637a9fc9c3752484a7f20 100644 (file)
@@ -138,29 +138,15 @@ class CompactImage : public SimpleImage
 public:
        CompactImage (AVPixelFormat, Size);
        CompactImage (boost::shared_ptr<Image>);
-};
-
-/** @class RGBFrameImage
- *  @brief An RGB image that is held within an AVFrame.
- */
-class RGBFrameImage : public Image
-{
-public:
-       RGBFrameImage (Size);
-       ~RGBFrameImage ();
 
-       uint8_t ** data () const;
-       int * line_size () const;
-       int * stride () const;
-       Size size () const;
-       AVFrame * frame () const {
-               return _frame;
+       AVPicture const * picture () const {
+               return &_picture;
        }
 
 private:
-       Size _size;
-       AVFrame* _frame;
-       uint8_t* _data;
+       void setup_picture ();
+       
+       AVPicture _picture;
 };
 
 #endif
index cc2fd9d231fa0bd718b785be655cec4c40f740b7..fd4e5b18df91aa00aeb4ea638f13c6258d5cb657 100644 (file)
@@ -50,7 +50,7 @@ ImageMagickDecoder::pass ()
        }
 
        Size size = native_size ();
-       RGBFrameImage image (size);
+       CompactImage image (PIX_FMT_RGB24, size);
 
        uint8_t* p = image.data()[0];
        for (int y = 0; y < size.height; ++y) {
@@ -63,7 +63,7 @@ ImageMagickDecoder::pass ()
 
        }
        
-       process_video (image.frame ());
+       process_video ((AVFrame const *) image.picture());
 
        _done = true;
        return false;
index c92e080d7cdf0076abb4b36077739ccae05b9e8f..7e9bda139a43f9967d4556fee975f6f6d36bd2d7 100644 (file)
@@ -147,7 +147,7 @@ TIFFDecoder::pass ()
                throw DecodeError ("could not read TIFF data");
        }
 
-       RGBFrameImage image (Size (width, height));
+       CompactImage image (PIX_FMT_RGB24, Size (width, height));
 
        uint8_t* p = image.data()[0];
        for (uint32_t y = 0; y < height; ++y) {
@@ -162,7 +162,7 @@ TIFFDecoder::pass ()
        _TIFFfree (raster);
        TIFFClose (t);
 
-       process_video (image.frame ());
+       process_video ((AVFrame const *) image.picture ());
 
        ++_iter;
        return false;