Ticket #7638: dvd-audio-stream-ordering.dpatch

File dvd-audio-stream-ordering.dpatch, 1.7 KB (added by linux@…, 14 years ago)

patch to sort dvd audio stream according to their logical ids

Line 
1diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp
2index ab4017d..0b2ec38 100644
3--- a/mythtv/libs/libmythtv/avformatdecoder.cpp
4+++ b/mythtv/libs/libmythtv/avformatdecoder.cpp
5@@ -215,6 +215,43 @@ class AvFormatDecoderPrivate
6 };
7 
8 /**
9+ * \brief returns the logical audio stream id of a dvd audio stream
10+ *
11+ * subtracts the stream id offset based on the stream encoding
12+ */
13+static uint dvd_get_logical_audio_stream_id(uint stream_id)
14+{
15+    const uint AC3_OFFSET  = 0x80;
16+    const uint DTS_OFFSET  = 0x88;
17+    const uint LPCM_OFFSET = 0xA0;
18+    if (stream_id >= LPCM_OFFSET)
19+    {
20+        return stream_id - LPCM_OFFSET;
21+    }
22+    else if (stream_id >= DTS_OFFSET)
23+    {
24+        return stream_id - DTS_OFFSET;
25+    }
26+    else if (stream_id >= AC3_OFFSET)
27+    {
28+        return stream_id - AC3_OFFSET;
29+    }
30+    return -1;
31+}
32+
33+/**
34+ * \brief compares dvd audio streams based on their logical stream id
35+ */
36+static bool dvd_audio_stream_id_comparator(
37+    const StreamInfo& a,
38+    const StreamInfo& b)
39+{
40+    return
41+        dvd_get_logical_audio_stream_id(a.stream_id)
42+        < dvd_get_logical_audio_stream_id(b.stream_id);
43+}
44+
45+/**
46  * \brief Initialise either libmpeg2, or DVDV (Mac HW accel), to do decoding
47  *
48  * Both of these are meant to be alternatives to FFMPEG,
49@@ -2027,6 +2064,9 @@ int AvFormatDecoder::ScanStreams(bool novideo)
50     {
51         if (tracks[kTrackTypeAudio].size() > 1)
52         {
53+            sort(tracks[kTrackTypeAudio].begin(),
54+                 tracks[kTrackTypeAudio].end(),
55+                 dvd_audio_stream_id_comparator);
56             sinfo_vec_t::iterator it = tracks[kTrackTypeAudio].begin();
57             for (; it != tracks[kTrackTypeAudio].end(); ++it)
58             {