Trying to create export audio encoders with between 9 and 15 channels
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
index 77b608fa86b92a7c7734e9a0c1b835aa45c9d5bc..04c97ed3ba4d6b98cb87b706ec7ae47dea44ca6d 100644 (file)
@@ -206,9 +206,14 @@ FFmpegDecoder::deinterleave_audio (shared_ptr<FFmpegAudioStream> stream) const
 {
        DCPOMATIC_ASSERT (bytes_per_audio_sample (stream));
 
+DCPOMATIC_DISABLE_WARNINGS
        int const size = av_samples_get_buffer_size (
                0, stream->stream(_format_context)->codec->channels, _frame->nb_samples, audio_sample_format (stream), 1
                );
+DCPOMATIC_ENABLE_WARNINGS
+
+       /* XXX: can't we just use _frame->nb_samples directly here? */
+       /* XXX: can't we use swr_convert() to do the format conversion? */
 
        /* Deinterleave and convert to float */
 
@@ -336,7 +341,9 @@ FFmpegDecoder::deinterleave_audio (shared_ptr<FFmpegAudioStream> stream) const
 AVSampleFormat
 FFmpegDecoder::audio_sample_format (shared_ptr<FFmpegAudioStream> stream) const
 {
+DCPOMATIC_DISABLE_WARNINGS
        return stream->stream (_format_context)->codec->sample_fmt;
+DCPOMATIC_ENABLE_WARNINGS
 }
 
 int
@@ -398,9 +405,11 @@ FFmpegDecoder::seek (ContentTime time, bool accurate)
                avcodec_flush_buffers (video_codec_context());
        }
 
+DCPOMATIC_DISABLE_WARNINGS
        BOOST_FOREACH (shared_ptr<FFmpegAudioStream> i, ffmpeg_content()->ffmpeg_audio_streams()) {
                avcodec_flush_buffers (i->stream(_format_context)->codec);
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        if (subtitle_codec_context ()) {
                avcodec_flush_buffers (subtitle_codec_context ());
@@ -431,6 +440,7 @@ FFmpegDecoder::decode_audio_packet ()
                return;
        }
 
+DCPOMATIC_DISABLE_WARNINGS
        while (copy_packet.size > 0) {
 
                int frame_finished;
@@ -490,6 +500,7 @@ FFmpegDecoder::decode_audio_packet ()
                                        to_string(_pts_offset)
                                        );
                        }
+DCPOMATIC_ENABLE_WARNINGS
 
                        /* Give this data provided there is some, and its time is sane */
                        if (ct >= ContentTime() && data->frames() > 0) {
@@ -508,9 +519,11 @@ FFmpegDecoder::decode_video_packet ()
        DCPOMATIC_ASSERT (_video_stream);
 
        int frame_finished;
+DCPOMATIC_DISABLE_WARNINGS
        if (avcodec_decode_video2 (video_codec_context(), _frame, &frame_finished, &_packet) < 0 || !frame_finished) {
                return false;
        }
+DCPOMATIC_ENABLE_WARNINGS
 
        boost::mutex::scoped_lock lm (_filter_graphs_mutex);
 
@@ -626,23 +639,23 @@ FFmpegDecoder::decode_bitmap_subtitle (AVSubtitleRect const * rect, ContentTime
 #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
+       /* sub_p looks up into a BGRA palette which is at rect->pict.data[1];
           (i.e. first byte B, second G, third R, fourth A)
        */
-       uint32_t const * palette = (uint32_t *) rect->pict.data[1];
+       uint8_t const * palette = 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 at rect->data[1].
           (first byte B, second G, third R, fourth A)
        */
+       uint8_t const * palette = 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.
        */
        map<RGBA, RGBA> colour_map = ffmpeg_content()->subtitle_stream()->colours ();
        vector<RGBA> mapped_palette (rect->nb_colors);
-       uint8_t const * palette = rect->data[1];
        for (int i = 0; i < rect->nb_colors; ++i) {
                RGBA c (palette[2], palette[1], palette[0], palette[3]);
                map<RGBA, RGBA>::const_iterator j = colour_map.find (c);