]> granicus.if.org Git - handbrake/commitdiff
libhb: support AV_FRAME_DATA_MATRIXENCODING side data.
authorRodeo <tdskywalker@gmail.com>
Sun, 26 Jan 2014 16:12:23 +0000 (16:12 +0000)
committerRodeo <tdskywalker@gmail.com>
Sun, 26 Jan 2014 16:12:23 +0000 (16:12 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6000 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/common.c
libhb/common.h
libhb/deca52.c
libhb/decavcodec.c
libhb/declpcm.c
libhb/scan.c
win/CS/HandBrake.Interop/HandBrakeInterop/HbLib/hb_audio.cs

index 813ece48e25fc74b2c206969004597604fc818bc..720ff4976ca05e759392cb14d0af8ffe6f0d6a8b 100644 (file)
@@ -3431,7 +3431,8 @@ void hb_audio_config_init(hb_audio_config_t * audiocfg)
     audiocfg->in.samplerate = -1;
     audiocfg->in.samples_per_frame = -1;
     audiocfg->in.bitrate = -1;
-    audiocfg->in.channel_layout = -1;
+    audiocfg->in.matrix_encoding = AV_MATRIX_ENCODING_NONE;
+    audiocfg->in.channel_layout = 0;
     audiocfg->in.channel_map = NULL;
     audiocfg->lang.description[0] = 0;
     audiocfg->lang.simple[0] = 0;
index cf037e579124f2c30d98b0e3a511020de3b178ff..eece75e5514841b3fd287d251256b1b3c6745465 100644 (file)
@@ -677,6 +677,7 @@ struct hb_audio_config_s
         PRIVATE int samplerate; /* Input sample rate (Hz) */
         PRIVATE int samples_per_frame; /* Number of samples per frame */
         PRIVATE int bitrate; /* Input bitrate (bps) */
+        PRIVATE int matrix_encoding; /* Source matrix encoding mode, set by the audio decoder */
         PRIVATE uint64_t channel_layout; /* Source channel layout, set by the audio decoder */
         PRIVATE hb_chan_map_t * channel_map; /* Source channel map, set by the audio decoder */
     } in;
@@ -1010,6 +1011,7 @@ typedef struct hb_work_info_s
             uint64_t channel_layout;
             hb_chan_map_t * channel_map;
             int samples_per_frame;
+            int matrix_encoding;
         };
     };
 } hb_work_info_t;
index 5dde0378aa83b8ffcfa4e0a18d0f11dfc71c0676..015d00b3913585ad29e7f5201cb3e4a35a40a175 100644 (file)
@@ -537,6 +537,14 @@ static int deca52BSInfo( hb_work_object_t *w, const hb_buffer_t *b,
     info->mode = raw & 0x7;      /* bsmod is the following 3 bits */
     info->samples_per_frame = 1536;
 
+    if ((flags & A52_CHANNEL_MASK) == A52_DOLBY)
+    {
+        info->matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
+    }
+    else
+    {
+        info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
+    }
     info->channel_layout = (acmod2layout[(flags & A52_CHANNEL_MASK)] |
                             lfeon2layout[(flags & A52_LFE) != 0]);
 
index 1e760583b4f160823ecc236f3b193cbb0a7f6b3c..73692de5fabb31ac751973677a0c950eecb33ce7 100644 (file)
@@ -721,10 +721,30 @@ static int decavcodecaBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
                     if (truehd_mono)
                     {
                         info->channel_layout = AV_CH_LAYOUT_MONO;
+                        info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
                     }
                     else
                     {
-                        info->channel_layout = frame->channel_layout;
+                        AVFrameSideData *side_data;
+                        if ((side_data =
+                             av_frame_get_side_data(frame,
+                                                    AV_FRAME_DATA_MATRIXENCODING)) != NULL)
+                        {
+                            info->matrix_encoding = *side_data->data;
+                        }
+                        else
+                        {
+                            info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
+                        }
+                        if (info->matrix_encoding == AV_MATRIX_ENCODING_DOLBY ||
+                            info->matrix_encoding == AV_MATRIX_ENCODING_DPLII)
+                        {
+                            info->channel_layout = AV_CH_LAYOUT_STEREO_DOWNMIX;
+                        }
+                        else
+                        {
+                            info->channel_layout = frame->channel_layout;
+                        }
                     }
 
                     ret = 1;
index a8f2e32d42139165f47ae091ea723c152be12111..156b580564bf95ab7e1f75a61f2320d9bb1a7aa5 100644 (file)
@@ -378,6 +378,7 @@ static int declpcmBSInfo( hb_work_object_t *w, const hb_buffer_t *b,
     info->rate_base = 1;
     info->bitrate = bitrate;
     info->flags = ( b->data[3] << 16 ) | ( b->data[4] << 8 ) | b->data[5];
+    info->matrix_encoding = AV_MATRIX_ENCODING_NONE;
     info->channel_layout = hdr2layout[nchannels - 1];
     info->channel_map = &hb_libav_chan_map;
     info->samples_per_frame = ( duration * rate ) / 90000;
index 6dc5f6fc6682a809f7b330169645abbadbbf28d7..fc13810ed7e5a29608e249af64b363517ba4bc29 100644 (file)
@@ -1029,6 +1029,7 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
     audio->config.in.samplerate = info.rate;
     audio->config.in.samples_per_frame = info.samples_per_frame;
     audio->config.in.bitrate = info.bitrate;
+    audio->config.in.matrix_encoding = info.matrix_encoding;
     audio->config.in.channel_layout = info.channel_layout;
     audio->config.in.channel_map = info.channel_map;
     audio->config.in.version = info.version;
@@ -1145,11 +1146,7 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
             break;
     }
 
-    if (audio->config.in.channel_layout == AV_CH_LAYOUT_STEREO_DOWNMIX)
-    {
-        strcat(audio->config.lang.description, " (Dolby Surround)");
-    }
-    else if (audio->config.in.channel_layout)
+    if (audio->config.in.channel_layout)
     {
         int lfes     = (!!(audio->config.in.channel_layout & AV_CH_LOW_FREQUENCY) +
                         !!(audio->config.in.channel_layout & AV_CH_LOW_FREQUENCY_2));
@@ -1157,6 +1154,39 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
         char *desc   = audio->config.lang.description +
                         strlen(audio->config.lang.description);
         sprintf(desc, " (%d.%d ch)", channels - lfes, lfes);
+
+        // describe the matrix encoding mode, if any
+        switch (audio->config.in.matrix_encoding)
+        {
+            case AV_MATRIX_ENCODING_DOLBY:
+                if (audio->config.in.codec       == HB_ACODEC_AC3    ||
+                    audio->config.in.codec_param == AV_CODEC_ID_AC3  ||
+                    audio->config.in.codec_param == AV_CODEC_ID_EAC3 ||
+                    audio->config.in.codec_param == AV_CODEC_ID_TRUEHD)
+                {
+                    strcat(audio->config.lang.description, " (Dolby Surround)");
+                    break;
+                }
+                strcat(audio->config.lang.description, " (Lt/Rt)");
+                break;
+            case AV_MATRIX_ENCODING_DPLII:
+                strcat(audio->config.lang.description, " (Dolby Pro Logic II)");
+                break;
+            case AV_MATRIX_ENCODING_DPLIIX:
+                strcat(audio->config.lang.description, " (Dolby Pro Logic IIx)");
+                break;
+            case AV_MATRIX_ENCODING_DPLIIZ:
+                strcat(audio->config.lang.description, " (Dolby Pro Logic IIz)");
+                break;
+            case AV_MATRIX_ENCODING_DOLBYEX:
+                strcat(audio->config.lang.description, " (Dolby Digital EX)");
+                break;
+            case AV_MATRIX_ENCODING_DOLBYHEADPHONE:
+                strcat(audio->config.lang.description, " (Dolby Headphone)");
+                break;
+            default:
+                break;
+        }
     }
 
     hb_log( "scan: audio 0x%x: %s, rate=%dHz, bitrate=%d %s", audio->id,
index 72ed63483ece585d3c92ec6ec61d06c1b3f66d5c..f0627670d247f72552fa4e4eca341e1cb40a4b65 100644 (file)
@@ -115,6 +115,9 @@ namespace HandBrake.Interop.HbLib
                /* Input bitrate (bps) */\r
                public int bitrate;\r
 \r
+               /* Source matrix encoding mode, set by the audio decoder */\r
+               public int matrix_encoding;\r
+\r
                /* Source channel layout, set by the audio decoder */\r
                public ulong channel_layout;\r
 \r