Allow build with the Ubuntu 16.04 version of FFmpeg.
authorCarl Hetherington <cth@carlh.net>
Tue, 3 May 2016 22:21:01 +0000 (23:21 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 3 May 2016 23:42:36 +0000 (00:42 +0100)
src/lib/ffmpeg.cc
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_examiner.cc
src/lib/image.cc
src/lib/wscript
wscript

index 296002c742385cbbc4a2f10ea3e6f7bbefa86348..656142cd42c7a42da00b1bdd7582b90b5ade641f 100644 (file)
@@ -280,10 +280,17 @@ FFmpeg::subtitle_id (AVSubtitle const & sub)
                digester.add (rect->y);
                digester.add (rect->w);
                digester.add (rect->h);
+#ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
+               int const line = rect->pict.linesize[0];
+               for (int j = 0; j < rect->h; ++j) {
+                       digester.add (rect->pict.data[0] + j * line, line);
+               }
+#else
                int const line = rect->linesize[0];
                for (int j = 0; j < rect->h; ++j) {
                        digester.add (rect->data[0] + j * line, line);
                }
+#endif
        }
        return digester.get ();
 }
index e5e1f04ac428e4e23671febf874679f75da5fe68..698078b5b4339eae552aa67d249d24d24bd82d9d 100644 (file)
@@ -495,12 +495,21 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTimeP
        */
        shared_ptr<Image> image (new Image (AV_PIX_FMT_RGBA, dcp::Size (rect->w, rect->h), true));
 
+#ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
+       /* Start of the first line in the subtitle */
+       uint8_t* sub_p = rect->pict.data[0];
+       /* sub_p looks up into a BGRA palette which is here
+          (i.e. first byte B, second G, third R, fourth A)
+       */
+       uint32_t const * palette = (uint32_t *) rect->pict.data[1];
+#else
        /* Start of the first line in the subtitle */
        uint8_t* sub_p = rect->data[0];
        /* sub_p looks up into a BGRA palette which is here
           (i.e. first byte B, second G, third R, fourth A)
        */
        uint32_t const * palette = (uint32_t *) rect->data[1];
+#endif
        /* And the stream has a map of those palette colours to colours
           chosen by the user; created a `mapped' palette from those settings.
        */
@@ -531,7 +540,11 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTimeP
                        /* XXX: this seems to be wrong to me (isn't the output image RGBA?) but it looks right on screen */
                        *out_line_p++ = (p.a << 24) | (p.r << 16) | (p.g << 8) | p.b;
                }
+#ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
+               sub_p += rect->pict.linesize[0];
+#else
                sub_p += rect->linesize[0];
+#endif
                out_p += image->stride()[0] / sizeof (uint32_t);
        }
 
index 64866047863afc9de6b9f9893609d84958e4c723..2b8b2b743f82d61b4e83ea3bbf37cd5577c38647 100644 (file)
@@ -249,6 +249,19 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti
 
                for (unsigned int i = 0; i < sub.num_rects; ++i) {
                        if (sub.rects[i]->type == SUBTITLE_BITMAP) {
+#ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
+                               uint32_t* palette = (uint32_t *) sub.rects[i]->pict.data[1];
+                               for (int j = 0; j < sub.rects[i]->nb_colors; ++j) {
+                                       RGBA rgba  (
+                                               (palette[j] & 0x00ff0000) >> 16,
+                                               (palette[j] & 0x0000ff00) >> 8,
+                                               (palette[j] & 0x000000ff) >> 0,
+                                               (palette[j] & 0xff000000) >> 24
+                                               );
+
+                                       stream->set_colour (rgba, rgba);
+                               }
+#else
                                uint32_t* palette = (uint32_t *) sub.rects[i]->data[1];
                                for (int j = 0; j < sub.rects[i]->nb_colors; ++j) {
                                        RGBA rgba  (
@@ -260,6 +273,7 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti
 
                                        stream->set_colour (rgba, rgba);
                                }
+#endif
                        }
                }
 
index 7ccb9906eda8663ec6b3eb92a8d56f12802fe7aa..49cb20a613565fdca2cd927d6de85b94b14c1093 100644 (file)
@@ -581,6 +581,18 @@ Image::bytes_per_pixel (int c) const
 
        float bpp[4] = { 0, 0, 0, 0 };
 
+#ifdef DCPOMATIC_HAVE_AVCOMPONENTDESCRIPTOR_DEPTH_MINUS1
+       bpp[0] = floor ((d->comp[0].depth_minus1 + 8) / 8);
+       if (d->nb_components > 1) {
+               bpp[1] = floor ((d->comp[1].depth_minus1 + 8) / 8) / pow (2.0f, d->log2_chroma_w);
+       }
+       if (d->nb_components > 2) {
+               bpp[2] = floor ((d->comp[2].depth_minus1 + 8) / 8) / pow (2.0f, d->log2_chroma_w);
+       }
+       if (d->nb_components > 3) {
+               bpp[3] = floor ((d->comp[3].depth_minus1 + 8) / 8) / pow (2.0f, d->log2_chroma_w);
+       }
+#else
        bpp[0] = floor ((d->comp[0].depth + 7) / 8);
        if (d->nb_components > 1) {
                bpp[1] = floor ((d->comp[1].depth + 7) / 8) / pow (2.0f, d->log2_chroma_w);
@@ -591,6 +603,7 @@ Image::bytes_per_pixel (int c) const
        if (d->nb_components > 3) {
                bpp[3] = floor ((d->comp[3].depth + 7) / 8) / pow (2.0f, d->log2_chroma_w);
        }
+#endif
 
        if ((d->flags & AV_PIX_FMT_FLAG_PLANAR) == 0) {
                /* Not planar; sum them up */
index 8dd241a4d92852ee6baab7969bf0d354b1ee2705..d6d85af49b372f6d6fad8185ae13bfe30106bd7a 100644 (file)
@@ -154,7 +154,7 @@ def build(bld):
                  AVCODEC AVUTIL AVFORMAT AVFILTER SWSCALE
                  BOOST_FILESYSTEM BOOST_THREAD BOOST_DATETIME BOOST_SIGNALS2 BOOST_REGEX
                  SNDFILE SAMPLERATE POSTPROC TIFF MAGICK SSH DCP CXML GLIB LZMA XML++
-                 CURL ZIP FONTCONFIG PANGOMM CAIROMM XMLSEC SUB ICU PATCHED_FFMPEG
+                 CURL ZIP FONTCONFIG PANGOMM CAIROMM XMLSEC SUB ICU
                  """
 
     if bld.env.TARGET_OSX:
diff --git a/wscript b/wscript
index c2328f0d28e4c97c97d05a51a832f85bd953984c..12370ee322510045738923c2daa2ee5e5a85c274 100644 (file)
--- a/wscript
+++ b/wscript
@@ -79,6 +79,8 @@ def configure(conf):
                                        '-Wno-attributes',
                                        '-Wextra',
                                        '-Wno-unused-result',
+                                       # Remove auto_ptr warnings from libxml++-2.6
+                                       '-Wno-deprecated-declarations',
                                        '-D_FILE_OFFSET_BITS=64'])
 
     if conf.options.enable_debug:
@@ -98,7 +100,6 @@ def configure(conf):
         conf.env.append_value('CXXFLAGS', '-DUNICODE')
         conf.env.append_value('CXXFLAGS', '-DBOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN')
         conf.env.append_value('CXXFLAGS', '-mfpmath=sse')
-        conf.env.append_value('CXXFLAGS', '-Wno-deprecated-declarations')
         wxrc = os.popen('wx-config --rescomp').read().split()[1:]
         conf.env.append_value('WINRCFLAGS', wxrc)
         if conf.options.enable_debug:
@@ -306,13 +307,50 @@ def configure(conf):
                             }\n
                             int main () { av_ebur128_get_true_peaks (0); }\n
                             """,
-                   msg='Checking for patched FFmpeg',
+                   msg='Checking for EBUR128-patched FFmpeg',
                    libpath=conf.env['LIBPATH_AVFORMAT'],
                    lib='avfilter avutil swresample',
                    includes=conf.env['INCLUDES_AVFORMAT'],
                    define_name='DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG',
                    mandatory=False)
 
+    # Check to see if we have our AVSubtitleRect has a pict member
+    # Older versions (e.g. that shipped with Ubuntu 16.04) do
+    conf.check_cxx(fragment="""
+                            extern "C" {\n
+                            #include <libavcodec/avcodec.h>\n
+                            }\n
+                            int main () { AVSubtitleRect r; r.pict; }\n
+                            """,
+                   msg='Checking for AVSubtitleRect::pict',
+                   cxxflags='-Wno-unused-result -Wno-unused-value -Wdeprecated-declarations -Werror',
+                   libpath=conf.env['LIBPATH_AVCODEC'],
+                   lib='avcodec',
+                   includes=conf.env['INCLUDES_AVCODEC'],
+                   define_name='DCPOMATIC_HAVE_AVSUBTITLERECT_PICT',
+                   mandatory=False)
+
+    # Check to see if we have our AVComponentDescriptor has a depth_minus1 member
+    # Older versions (e.g. that shipped with Ubuntu 16.04) do
+    conf.check_cxx(fragment="""
+                            extern "C" {\n
+                            #include <libavutil/pixdesc.h>\n
+                            }\n
+                            int main () { AVComponentDescriptor d; d.depth_minus1; }\n
+                            """,
+                   msg='Checking for AVComponentDescriptor::depth_minus1',
+                   cxxflags='-Wno-unused-result -Wno-unused-value -Wdeprecated-declarations -Werror',
+                   libpath=conf.env['LIBPATH_AVUTIL'],
+                   lib='avutil',
+                   includes=conf.env['INCLUDES_AVUTIL'],
+                   define_name='DCPOMATIC_HAVE_AVCOMPONENTDESCRIPTOR_DEPTH_MINUS1',
+                   mandatory=False)
+
+    # Hack: the previous two check_cxx calls end up copying their (necessary) cxxflags
+    # to these variables.  We don't want to use these for the actual build, so clearn them out.
+    conf.env['CXXFLAGS_AVCODEC'] = []
+    conf.env['CXXFLAGS_AVUTIL'] = []
+
     # Boost
     if conf.options.static_boost:
         conf.env.STLIB_BOOST_THREAD = ['boost_thread']