Folks,

Attached is an even more cleaned up version of this patch. 

1. I have removed the code to do audio track selection for PS recording, it 
should still work for TS. I will re-add this code after all this has made 
into into cvs.

2. Cleaned up some test code and hacks in transport.c. It now functions 
correctly and does not have the #if 0 stuff in it.

3. Tim, the change you made to the incCurrentAudioTrack call broke my setup. 
After looking at what you did I got an idea for a better fix which works for 
me and I am pretty sure it will work for you too. Can you test and confirm. 

4. This patch is a diff between cvs from a few hours ago, bigdvb3.5, and 
Marcus' latest trans.dif patch. It was based on v5 of the oz-ac3 as supplied 
by Tim. It should patch cleanly this time I hope.

5. Fixed some hard tabs that I accidentally put in.

Cheers,
Mark Anderson

On Fri, 14 Jan 2005 03:00 am, Jesper S�rensen wrote:
> Mark & Tim,
>
> Thanks for all your hard work! I'm going to try and merge this with the
> DVB patch but first a couple of things.
>
> The patch doesn't apply cleanly here and the way it looks now it's not
> gonna be easy merging this. It touches a lot of files (15 !!!) and does
> a lot of stuff. Would it be at all possible to trim it down a bit and/or
> split it into separate parts? If the changes could be kept to the DVB
> specific files that would be really great. Any "nice to have"  but not
> essential features maybe can be saved for a followup patch later? If I'm
> not misinformed I think Taylor is planning on submitting the DVB patch
> to Isaac real soon now (tm) so the less changes the better.
>
> You said it didn't require the mpeg.c hack any longer, and yet the patch
> touches that file? Did I miss something? :-)
>
> Also, could you please create the patch against current MythTV CVS,
> Taylor's patch 3.5 and Marcus' latest transform patch ("trans.diff",
> posted on mythtv-dev yesterday)?
>
> Thanks!
> Jesper
>
> _______________________________________________
> mythtv-dev mailing list
> [email protected]
> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev
Only in ./filters/adjust: filter_adjust.o
Only in ./filters/adjust: libadjust.so
Only in ./filters/bobdeint: filter_bobdeint.o
Only in ./filters/bobdeint: libbobdeint.so
Only in ./filters/convert: filter_convert.o
Only in ./filters/convert: libconvert.so
Only in ./filters/crop: filter_crop.o
Only in ./filters/crop: libcrop.so
Only in ./filters/denoise3d: filter_denoise3d.o
Only in ./filters/denoise3d: libdenoise3d.so
Only in ./filters/force: filter_force.o
Only in ./filters/force: libforce.so
Only in ./filters/invert: filter_invert.o
Only in ./filters/invert: libinvert.so
Only in ./filters/kerneldeint: filter_kerneldeint.o
Only in ./filters/kerneldeint: libkerneldeint.so
Only in ./filters/linearblend: filter_linearblend.o
Only in ./filters/linearblend: liblinearblend.so
Only in ./filters/onefield: filter_onefield.o
Only in ./filters/onefield: libonefield.so
Only in ./filters/postprocess: filter_postprocess.o
Only in ./filters/postprocess: libpostprocess.so
Only in ./filters/quickdnr: filter_quickdnr.o
Only in ./filters/quickdnr: libquickdnr.so
Only in ./i18n: dummy.o
Only in ./i18n: i18n
Only in ./libs/libavcodec: 4xm.o
Only in ./libs/libavcodec: 8bps.o
Only in ./libs/libavcodec: a52_bitstream.o
Only in ./libs/libavcodec: a52dec.o
Only in ./libs/libavcodec: ac3enc.o
Only in ./libs/libavcodec: adpcm.o
Only in ./libs/libavcodec: adx.o
Only in ./libs/libavcodec: allcodecs.o
Only in ./libs/libavcodec: asv1.o
Only in ./libs/libavcodec: audresample.o
Only in ./libs/libavcodec: bit_allocate.o
Only in ./libs/libavcodec: bitstream.o
Only in ./libs/libavcodec: cabac.o
Only in ./libs/libavcodec: cinepak.o
Only in ./libs/libavcodec: cljr.o
Only in ./libs/libavcodec: cputest.o
Only in ./libs/libavcodec: crc.o
Only in ./libs/libavcodec: cyuv.o
Only in ./libs/libavcodec: downmix.o
Only in ./libs/libavcodec: dpcm.o
Only in ./libs/libavcodec: dsputil_mmx.o
Only in ./libs/libavcodec: dsputil.o
Only in ./libs/libavcodec: dv.o
Only in ./libs/libavcodec: error_resilience.o
Only in ./libs/libavcodec: eval.o
Only in ./libs/libavcodec: faandct.o
Only in ./libs/libavcodec: fdct_mmx.o
Only in ./libs/libavcodec: fft.o
Only in ./libs/libavcodec: fft_sse.o
Only in ./libs/libavcodec: flac.o
Only in ./libs/libavcodec: flicvideo.o
Only in ./libs/libavcodec: g726.o
Only in ./libs/libavcodec: golomb.o
Only in ./libs/libavcodec: h261.o
Only in ./libs/libavcodec: h263dec.o
Only in ./libs/libavcodec: h263.o
Only in ./libs/libavcodec: h264idct.o
Only in ./libs/libavcodec: h264.o
Only in ./libs/libavcodec: huffyuv.o
Only in ./libs/libavcodec: idcinvideo.o
Only in ./libs/libavcodec: idct_mmx.o
Only in ./libs/libavcodec: imdct.o
Only in ./libs/libavcodec: imgconvert.o
Only in ./libs/libavcodec: imgresample.o
Only in ./libs/libavcodec: indeo3.o
Only in ./libs/libavcodec: integer.o
Only in ./libs/libavcodec: interplayvideo.o
Only in ./libs/libavcodec: jfdctfst.o
Only in ./libs/libavcodec: jfdctint.o
Only in ./libs/libavcodec: jrevdct.o
Only in ./libs/libavcodec: lcl.o
Only in ./libs/libavcodec: libmythavcodec-0.16.so
Only in ./libs/libavcodec: libmythavcodec-0.16.so.0
Only in ./libs/libavcodec: libmythavcodec-0.16.so.0.16
Only in ./libs/libavcodec: libmythavcodec-0.16.so.0.16.0
Only in ./libs/libavcodec: mace.o
Only in ./libs/libavcodec: mdct.o
Only in ./libs/libavcodec: mem.o
Only in ./libs/libavcodec: mjpeg.o
Only in ./libs/libavcodec: motion_est_mmx.o
Only in ./libs/libavcodec: motion_est.o
Only in ./libs/libavcodec: mpeg12.o
Only in ./libs/libavcodec: mpegaudiodec.o
Only in ./libs/libavcodec: mpegaudio.o
Only in ./libs/libavcodec: mpegvideo_mmx.o
Only in ./libs/libavcodec: mpegvideo.o
Only in ./libs/libavcodec: msmpeg4.o
Only in ./libs/libavcodec: msrle.o
Only in ./libs/libavcodec: msvideo1.o
Only in ./libs/libavcodec: opts.o
Only in ./libs/libavcodec: parse.o
Only in ./libs/libavcodec: parser.o
Only in ./libs/libavcodec: pcm.o
Only in ./libs/libavcodec: png.o
Only in ./libs/libavcodec: pnm.o
Only in ./libs/libavcodec: postprocess.o
Only in ./libs/libavcodec: qdrw.o
Only in ./libs/libavcodec: qpeg.o
Only in ./libs/libavcodec: qtrle.o
Only in ./libs/libavcodec: ra144.o
Only in ./libs/libavcodec: ra288.o
Only in ./libs/libavcodec: rangecoder.o
Only in ./libs/libavcodec: ratecontrol.o
Only in ./libs/libavcodec: rational.o
Only in ./libs/libavcodec: raw.o
Only in ./libs/libavcodec: resample2.o
Only in ./libs/libavcodec: resample.o
Only in ./libs/libavcodec: roqvideo.o
Only in ./libs/libavcodec: rpza.o
Only in ./libs/libavcodec: rv10.o
Only in ./libs/libavcodec: simple_idct_mmx.o
Only in ./libs/libavcodec: simple_idct.o
Only in ./libs/libavcodec: smc.o
Only in ./libs/libavcodec: snow.o
Only in ./libs/libavcodec: sonic.o
Only in ./libs/libavcodec: svq1.o
Only in ./libs/libavcodec: truemotion1.o
Only in ./libs/libavcodec: tscc.o
Only in ./libs/libavcodec: ulti.o
Only in ./libs/libavcodec: utils.o
Only in ./libs/libavcodec: vcr1.o
Only in ./libs/libavcodec: vmdav.o
Only in ./libs/libavcodec: vp3dsp_mmx.o
Only in ./libs/libavcodec: vp3dsp.o
Only in ./libs/libavcodec: vp3dsp_sse2.o
Only in ./libs/libavcodec: vp3.o
Only in ./libs/libavcodec: vqavideo.o
Only in ./libs/libavcodec: wmadec.o
Only in ./libs/libavcodec: xan.o
Only in ./libs/libavcodec: xl.o
Only in ./libs/libavcodec: xvmcvideo.o
Only in ./libs/libavformat: 4xm.o
Only in ./libs/libavformat: allformats.o
Only in ./libs/libavformat: asf-enc.o
Only in ./libs/libavformat: asf.o
Only in ./libs/libavformat: audio.o
Only in ./libs/libavformat: au.o
Only in ./libs/libavformat: avidec.o
Only in ./libs/libavformat: avienc.o
Only in ./libs/libavformat: aviobuf.o
Only in ./libs/libavformat: avio.o
Only in ./libs/libavformat: crc.o
Only in ./libs/libavformat: cutils.o
Only in ./libs/libavformat: dv.o
Only in ./libs/libavformat: electronicarts.o
Only in ./libs/libavformat: ffm.o
Only in ./libs/libavformat: file.o
Only in ./libs/libavformat: flic.o
Only in ./libs/libavformat: flvdec.o
Only in ./libs/libavformat: flvenc.o
Only in ./libs/libavformat: idcin.o
Only in ./libs/libavformat: idroq.o
Only in ./libs/libavformat: img2.o
Only in ./libs/libavformat: img.o
Only in ./libs/libavformat: ipmovie.o
Only in ./libs/libavformat: libmythavformat-0.16.so
Only in ./libs/libavformat: libmythavformat-0.16.so.0
Only in ./libs/libavformat: libmythavformat-0.16.so.0.16
Only in ./libs/libavformat: libmythavformat-0.16.so.0.16.0
Only in ./libs/libavformat: matroska.o
Only in ./libs/libavformat: movenc.o
Only in ./libs/libavformat: mov.o
Only in ./libs/libavformat: mp3.o
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/libs/libavformat/mpeg.c ./libs/libavformat/mpeg.c
--- ../mythtv.orig/libs/libavformat/mpeg.c	2005-01-08 17:32:42.000000000 +1100
+++ ./libs/libavformat/mpeg.c	2005-01-14 18:13:47.000000000 +1100
@@ -1531,6 +1531,11 @@ static int mpegps_read_packet(AVFormatCo
         goto skip;
     st->codec.codec_type = type;
     st->codec.codec_id = codec_id;
+    /*notify the callback of the change in streams*/
+    if (s->streams_changed) {
+        s->streams_changed(s->stream_change_data);
+    }
+
     if (codec_id != CODEC_ID_PCM_S16BE)
         st->need_parsing = 1;
  found:
Only in ./libs/libavformat: mpeg.o
Only in ./libs/libavformat: mpegtsenc.o
Only in ./libs/libavformat: mpegts.o
Only in ./libs/libavformat: mpjpeg.o
Only in ./libs/libavformat: nsvdec.o
Only in ./libs/libavformat: nut.o
Only in ./libs/libavformat: os_support.o
Only in ./libs/libavformat: psxstr.o
Only in ./libs/libavformat: raw.o
Only in ./libs/libavformat: rm.o
Only in ./libs/libavformat: segafilm.o
Only in ./libs/libavformat: sierravmd.o
Only in ./libs/libavformat: sol.o
Only in ./libs/libavformat: swf.o
Only in ./libs/libavformat: utils.o
Only in ./libs/libavformat: wav.o
Only in ./libs/libavformat: wc3movie.o
Only in ./libs/libavformat: westwood.o
Only in ./libs/libavformat: yuv4mpeg.o
Only in ./libs/libmyth: audiooutputalsa.o
Only in ./libs/libmyth: audiooutputbase.o
Only in ./libs/libmyth: audiooutput.o
Only in ./libs/libmyth: audiooutputoss.o
Only in ./libs/libmyth: dbsettings.o
Only in ./libs/libmyth: dialogbox.o
Only in ./libs/libmyth: DisplayRes.o
Only in ./libs/libmyth: generictree.o
Only in ./libs/libmyth: httpcomms.o
Only in ./libs/libmyth: inetcomms.o
Only in ./libs/libmyth: jsmenuevent.o
Only in ./libs/libmyth: jsmenu.o
Only in ./libs/libmyth: lcddevice.o
Only in ./libs/libmyth: libmyth-0.16.so
Only in ./libs/libmyth: libmyth-0.16.so.0
Only in ./libs/libmyth: libmyth-0.16.so.0.16
Only in ./libs/libmyth: libmyth-0.16.so.0.16.0
Only in ./libs/libmyth: lircevent.o
Only in ./libs/libmyth: lirc.o
Only in ./libs/libmyth: managedlist.o
Only in ./libs/libmyth: moc_dialogbox.cpp
Only in ./libs/libmyth: moc_dialogbox.o
Only in ./libs/libmyth: moc_httpcomms.cpp
Only in ./libs/libmyth: moc_httpcomms.o
Only in ./libs/libmyth: moc_inetcomms.cpp
Only in ./libs/libmyth: moc_inetcomms.o
Only in ./libs/libmyth: moc_jsmenu.cpp
Only in ./libs/libmyth: moc_jsmenu.o
Only in ./libs/libmyth: moc_lcddevice.cpp
Only in ./libs/libmyth: moc_lcddevice.o
Only in ./libs/libmyth: moc_lirc.cpp
Only in ./libs/libmyth: moc_lirc.o
Only in ./libs/libmyth: moc_managedlist.cpp
Only in ./libs/libmyth: moc_managedlist.o
Only in ./libs/libmyth: moc_mythcdrom.cpp
Only in ./libs/libmyth: moc_mythcdrom.o
Only in ./libs/libmyth: moc_mythcontext.cpp
Only in ./libs/libmyth: moc_mythcontext.o
Only in ./libs/libmyth: moc_mythdialogs.cpp
Only in ./libs/libmyth: moc_mythdialogs.o
Only in ./libs/libmyth: moc_mythmedia.cpp
Only in ./libs/libmyth: moc_mythmediamonitor.cpp
Only in ./libs/libmyth: moc_mythmediamonitor.o
Only in ./libs/libmyth: moc_mythmedia.o
Only in ./libs/libmyth: moc_mythwidgets.cpp
Only in ./libs/libmyth: moc_mythwidgets.o
Only in ./libs/libmyth: moc_mythwizard.cpp
Only in ./libs/libmyth: moc_mythwizard.o
Only in ./libs/libmyth: moc_settings.cpp
Only in ./libs/libmyth: moc_settings.o
Only in ./libs/libmyth: moc_themedmenu.cpp
Only in ./libs/libmyth: moc_themedmenu.o
Only in ./libs/libmyth: moc_uilistbtntype.cpp
Only in ./libs/libmyth: moc_uilistbtntype.o
Only in ./libs/libmyth: moc_uiphoneentry.cpp
Only in ./libs/libmyth: moc_uiphoneentry.o
Only in ./libs/libmyth: moc_uitypes.cpp
Only in ./libs/libmyth: moc_uitypes.o
Only in ./libs/libmyth: mythcdrom-linux.o
Only in ./libs/libmyth: mythcdrom.o
Only in ./libs/libmyth: mythcontext.o
Only in ./libs/libmyth: mythdialogs.o
Only in ./libs/libmyth: mythmediamonitor.o
Only in ./libs/libmyth: mythmedia.o
Only in ./libs/libmyth: mythplugin.o
Only in ./libs/libmyth: mythwidgets.o
Only in ./libs/libmyth: mythwizard.o
Only in ./libs/libmyth: oldsettings.o
Only in ./libs/libmyth: remotefile.o
Only in ./libs/libmyth: screensaver-null.o
Only in ./libs/libmyth: screensaver.o
Only in ./libs/libmyth: screensaver-x11.o
Only in ./libs/libmyth: settings.o
Only in ./libs/libmyth: themedmenu.o
Only in ./libs/libmyth: uilistbtntype.o
Only in ./libs/libmyth: uiphoneentry.o
Only in ./libs/libmyth: uitypes.o
Only in ./libs/libmyth: util.o
Only in ./libs/libmyth: volumebase.o
Only in ./libs/libmyth: volumecontrol.o
Only in ./libs/libmyth: xmlparse.o
Only in ./libs/libmythsamplerate: libmythsamplerate-0.16.a
Only in ./libs/libmythsamplerate: samplerate.o
Only in ./libs/libmythsamplerate: src_linear.o
Only in ./libs/libmythsamplerate: src_sinc.o
Only in ./libs/libmythsamplerate: src_zoh.o
Only in ./libs/libmythsoundtouch: AAFilter.o
Only in ./libs/libmythsoundtouch: cpu_detect_x86_gcc.o
Only in ./libs/libmythsoundtouch: FIFOSampleBuffer.o
Only in ./libs/libmythsoundtouch: FIRFilter.o
Only in ./libs/libmythsoundtouch: libmythsoundtouch-0.16.a
Only in ./libs/libmythsoundtouch: mmx_gcc.o
Only in ./libs/libmythsoundtouch: RateTransposer.o
Only in ./libs/libmythsoundtouch: SoundTouch.o
Only in ./libs/libmythsoundtouch: TDStretch.o
Only in ./libs/libmythtv: atscdescriptorsmap.o
Only in ./libs/libmythtv: atscdescriptors.o
Only in ./libs/libmythtv: atscstreamdata.o
Only in ./libs/libmythtv: atsctables.o
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/libs/libmythtv/avformatdecoder.cpp ./libs/libmythtv/avformatdecoder.cpp
--- ../mythtv.orig/libs/libmythtv/avformatdecoder.cpp	2005-01-09 03:48:12.000000000 +1100
+++ ./libs/libmythtv/avformatdecoder.cpp	2005-01-14 20:46:48.669525196 +1100
@@ -39,6 +39,7 @@ AvFormatDecoder::AvFormatDecoder(NuppelV
     audio_channels = -1;
     audio_sample_size = -1;
     audio_sampling_rate = -1;
+    audio_codec = -1;
 
     exitafterdecoded = false;
     ateof = false;
@@ -522,11 +523,8 @@ int AvFormatDecoder::ScanStreams(bool no
         {
             VERBOSE(VB_IMPORTANT, 
                     QString("AvFormatDecoder: Could not find decoder for "
-                            "codec (%1) aborting.")
+                            "codec,  ignoring (%1).")
                            .arg(enc->codec_id));
-            av_close_input_file(ic);
-            ic = NULL;
-            scanerror = -1;
             continue;
         }
 
@@ -597,28 +595,31 @@ bool AvFormatDecoder::CheckVideoParams(i
     return true;
 }
 
-void AvFormatDecoder::CheckAudioParams(int freq, int channels, bool safe)
+void AvFormatDecoder::CheckAudioParams(int freq, int channels, int codec_id, bool safe)
 {
     if (freq <= 0 || channels <= 0)
         return;
 
     if (safe || audio_check_1st == 2)
     {
-        if (freq == audio_sampling_rate && channels == audio_channels)
+        if (freq == audio_sampling_rate && channels == audio_channels && audio_codec == codec_id) 
             return;
         audio_check_1st = 1;
         audio_sampling_rate_2nd = freq;
         audio_channels_2nd = channels;
+        audio_codec_2nd = codec_id; 
         if (safe == false)
             return;
     }
     else
     {
         if (freq != audio_sampling_rate_2nd || channels != audio_channels_2nd ||
-            (freq == audio_sampling_rate && channels == audio_channels))
+            codec_id != audio_codec_2nd ||
+            (freq == audio_sampling_rate && channels == audio_channels && codec_id == audio_codec))
         {
             audio_sampling_rate_2nd = -1;
             audio_channels_2nd = -1;
+            audio_codec_2nd = -1;
             audio_check_1st = 2;
             return;
         }
@@ -633,9 +634,12 @@ void AvFormatDecoder::CheckAudioParams(i
     audio_check_1st = 2;
 
     if (audio_channels != -1)
-        VERBOSE(VB_AUDIO, QString("Audio format changed from %1 channels,"
-                " %2hz to %3 channels %4hz").arg(audio_channels)
-                .arg(audio_sampling_rate).arg(channels).arg(freq));
+    {
+        VERBOSE(VB_ALL, QString("Audio format changed from %1 channels,"
+                " %2hz codec %3 to %4 channels %5hz codec %6").arg(audio_channels)
+                .arg(audio_sampling_rate).arg(audio_codec).arg(channels)
+                .arg(freq).arg(codec_id));
+    }
 
     AVCodecContext *enc = &ic->streams[wantedAudioStream]->codec;
     AVCodec *codec = enc->codec;
@@ -1019,7 +1023,7 @@ void AvFormatDecoder::incCurrentAudioTra
         wantedAudioStream = audioStreams[currentAudioTrack];
 
         AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
-        CheckAudioParams(e->sample_rate, e->channels, true);
+        CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
     }
 }
 
@@ -1036,7 +1040,7 @@ void AvFormatDecoder::decCurrentAudioTra
         wantedAudioStream = audioStreams[currentAudioTrack];
 
         AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
-        CheckAudioParams(e->sample_rate, e->channels, true);
+        CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
     }
 }
 
@@ -1054,15 +1058,20 @@ bool AvFormatDecoder::setCurrentAudioTra
     wantedAudioStream = audioStreams[currentAudioTrack];
 
     AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
-    CheckAudioParams(e->sample_rate, e->channels, true);
+    CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
     return true;
 }
 
-bool AvFormatDecoder::autoSelectAudioTrack()
+bool AvFormatDecoder::autoSelectAudioTrack(bool prefer_ac3)
 {
     if (!audioStreams.size())
         return false;
 
+    if (prefer_ac3)
+    {
+        prefer_ac3 = gContext->GetNumSetting("WantAC3", false);
+    }
+
     bool foundAudio = false;
     int minChannels = 1;
     int maxTracks = (audioStreams.size() - 1);
@@ -1077,6 +1086,12 @@ bool AvFormatDecoder::autoSelectAudioTra
             int tempStream = audioStreams[track];
             AVCodecContext *e = &ic->streams[tempStream]->codec;
 
+            if (((prefer_ac3) && (e->codec_id != CODEC_ID_AC3)) || 
+                ((!prefer_ac3) && (e->codec_id == CODEC_ID_AC3))) 
+            {
+                continue;
+            }
+
             if (e->channels > minChannels)
             {
                 currentAudioTrack = track;
@@ -1087,16 +1102,26 @@ bool AvFormatDecoder::autoSelectAudioTra
                 VERBOSE(VB_AUDIO, 
                         QString("It has %1 channels and we needed at least %2")
                                .arg(e->channels).arg(minChannels + 1));
+                if (prefer_ac3)
+                {
+                    VERBOSE(VB_ALL, QString("AC3 stream has been selected"));
+                }
 
                 AVCodecContext *e = &ic->streams[wantedAudioStream]->codec;
-                CheckAudioParams(e->sample_rate, e->channels, true);
+                CheckAudioParams(e->sample_rate, e->channels, e->codec_id, true);
                 return true;
             }
         }
         minChannels--;
         if (minChannels < 0)
+        {
+            if (prefer_ac3)
+            {
+                return autoSelectAudioTrack(false);
+            }
             return false;
     }
+    }
 
     return false;
 }
@@ -1113,6 +1138,8 @@ void AvFormatDecoder::SetupAudioStream(v
     VERBOSE(VB_ALL, QString("Initializing audio parms from stream #%1.")
             .arg(currentAudioTrack));
 
+    audio_codec = curstream->codec.codec_id;
+
     m_parent->SetEffDsp(curstream->codec.sample_rate * 100);
 
     do_ac3_passthru = curstream->codec.codec_id == CODEC_ID_AC3 &&
@@ -1120,6 +1147,7 @@ void AvFormatDecoder::SetupAudioStream(v
 
     if (do_ac3_passthru)
     {
+        VERBOSE(VB_ALL, QString("AC3 passthrough is enabled"));
         // An AC3 stream looks like a 48KHz 2ch audio stream to
         // the sound card
         audio_sample_size = 4;
@@ -1278,6 +1306,12 @@ bool AvFormatDecoder::GetFrame(int onlyv
                     if (onlyvideo != 0 ||
                         (pkt->stream_index != wantedAudioStream))
                     {
+					    //hmm the codec has changed from what we were initialised with
+                        //move to the next stream to see if it is correct
+                        if (pkt->stream_index != wantedAudioStream)
+                        {
+                            incCurrentAudioTrack();
+                        }
                         ptr += pkt->size;
                         len -= pkt->size;
                         continue;
@@ -1304,7 +1338,9 @@ bool AvFormatDecoder::GetFrame(int onlyv
 
                     if (!do_ac3_passthru)
                         CheckAudioParams(curstream->codec.sample_rate,
-                                         curstream->codec.channels, false);
+                                         curstream->codec.channels, 
+                                         curstream->codec.codec_id,
+                                         false);
 
                     long long temppts = lastapts;
 
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/libs/libmythtv/avformatdecoder.h ./libs/libmythtv/avformatdecoder.h
--- ../mythtv.orig/libs/libmythtv/avformatdecoder.h	2005-01-09 03:48:12.000000000 +1100
+++ ./libs/libmythtv/avformatdecoder.h	2005-01-14 20:10:53.515585131 +1100
@@ -78,7 +78,7 @@ class AvFormatDecoder : public DecoderBa
     /// Attempt to find the optimal audio stream to use based on the number of channels,
     /// and if we're doing AC3 passthrough.  This will select the highest stream number
     /// that matches our criteria.
-    bool autoSelectAudioTrack();
+    bool autoSelectAudioTrack(bool wantac3 = true);
 
     RingBuffer *getRingBuf(void) { return ringBuffer; }
 
@@ -112,7 +112,7 @@ class AvFormatDecoder : public DecoderBa
     bool CheckVideoParams(int width, int height);
 
     /// See if the audio parameters have changed, return true if so.
-    void CheckAudioParams(int freq, int channels, bool safe);
+    void CheckAudioParams(int freq, int channels, int codec, bool safe);
     void SetupAudioStream(void);
 
     int EncodeAC3Frame(unsigned char* data, int len, short *samples,
@@ -134,10 +134,12 @@ class AvFormatDecoder : public DecoderBa
     int audio_sample_size;
     int audio_sampling_rate;
     int audio_channels;
+    int audio_codec;
 
     int audio_check_1st;         ///< Used by CheckAudioParams
     int audio_sampling_rate_2nd; ///< Used by CheckAudioParams
     int audio_channels_2nd;      ///< Used by CheckAudioParams
+    int audio_codec_2nd;         ///< Used by CheckAudioParams
 
     int bitrate;
 
Only in ./libs/libmythtv: avformatdecoder.o
Only in ./libs/libmythtv: blend.o
Only in ./libs/libmythtv: cc.o
Only in ./libs/libmythtv: channelbase.o
Only in ./libs/libmythtv: channeleditor.o
Only in ./libs/libmythtv: channel.o
Only in ./libs/libmythtv: channelsettings.o
Only in ./libs/libmythtv: commercial_skip.o
Only in ./libs/libmythtv: datadirect.o
Only in ./libs/libmythtv: dbcheck.o
Only in ./libs/libmythtv: decoderbase.o
Only in ./libs/libmythtv: dtvrecorder.o
Only in ./libs/libmythtv: dvbcam.o
Only in ./libs/libmythtv: dvbchannel.o
Only in ./libs/libmythtv: dvbci.o
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/libs/libmythtv/dvbdev/transform.c ./libs/libmythtv/dvbdev/transform.c
--- ../mythtv.orig/libs/libmythtv/dvbdev/transform.c	2005-01-14 20:50:31.573612274 +1100
+++ ./libs/libmythtv/dvbdev/transform.c	2005-01-14 20:57:17.909276010 +1100
@@ -434,6 +434,7 @@ void send_ipack(ipack *p)
 			switch (streamid & 0xF8){
 
 			case 0x80: 
+				p->buf[8] = p->hlength;
 				p->count += 4;
 				p->buf[9] = streamid;
 				p->buf[10] = 0;
@@ -481,18 +482,17 @@ static void write_ipack(ipack *p, uint8_
 		case PRIV_TS_AC3: /* keep this as default */
 		default:
 		{
-			int ac3_off;
-			ac3_off = get_ac3info(data, count, &ai,0);
-			if (ac3_off>=0 && ai.framesize){
+				/*
+				 * add in a dummy 4 byte audio header
+				 * to match mpeg dvd standard. The values
+				 * will be filled in later (in send_ipack)
+				 * when it has a full packet to search
+				 */
 				p->buf[p->count] = 0x80;
-				p->buf[p->count+1] = (p->size - p->count
-						      - 4 - ac3_off)/ 
-					ai.framesize + 1;
-				p->buf[p->count+2] = (ac3_off >> 8)& 0xFF;
-				p->buf[p->count+3] = (ac3_off)& 0xFF;
+				p->buf[p->count+1] = 0;
+				p->buf[p->count+2] = 0;
+				p->buf[p->count+3] = 0;
 				p->count+=4;
-				
-			}
 		}
 		break;
 		}
Only in ./libs/libmythtv: dvbdev.o
Only in ./libs/libmythtv: dvbdiseqc.o
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/libs/libmythtv/dvbrecorder.cpp ./libs/libmythtv/dvbrecorder.cpp
--- ../mythtv.orig/libs/libmythtv/dvbrecorder.cpp	2005-01-14 20:50:00.816697807 +1100
+++ ./libs/libmythtv/dvbrecorder.cpp	2005-01-14 20:07:41.000000000 +1100
@@ -51,6 +51,7 @@ using namespace std;
 
 #include "RingBuffer.h"
 #include "programinfo.h"
+#include "mythcontext.h"
 
 #include "transform.h"
 #include "dvbtypes.h"
@@ -351,7 +352,7 @@ void DVBRecorder::SetDemuxFilters()
     else
     {
         // PES recording currently only supports one video and one audio PID (I think???)
-        ElementaryPIDObject *as = m_pmt.PreferredAudioStream();
+        ElementaryPIDObject *as = m_pmt.PreferredAudioStream(gContext->GetNumSetting("WantAC3", false));
         ElementaryPIDObject *vs = m_pmt.PreferredVideoStream();
         ElementaryPIDObject *sub = m_pmt.PreferredSubtitleStream();
 
@@ -838,7 +839,7 @@ void DVBRecorder::CreatePMT(uint8_t *ts_
     {
         if ((*es).Record)
         {
-            pmt[p++] = (*es).Orig_Type;
+            pmt[p++] = (*es).Type == ES_TYPE_AUDIO_AC3 ? STREAM_TYPE_AUDIO_AC3 : (*es).Orig_Type;
             pmt[p++] = ((*es).PID >> 8) & 0x1F;
             pmt[p++] = (*es).PID & 0xFF;
             
Only in ./libs/libmythtv: dvbrecorder.o
Only in ./libs/libmythtv: dvbsignalmonitor.o
Only in ./libs/libmythtv: dvbsiparser.o
Only in ./libs/libmythtv: dvbtransporteditor.o
Only in ./libs/libmythtv: fifowriter.o
Only in ./libs/libmythtv: filtermanager.o
Only in ./libs/libmythtv: frequencies.o
Only in ./libs/libmythtv: guidegrid.o
Only in ./libs/libmythtv: hamm.o
Only in ./libs/libmythtv: hdtvrecorder.o
Only in ./libs/libmythtv: infostructs.o
Only in ./libs/libmythtv: ivtvdecoder.o
Only in ./libs/libmythtv: jitterometer.o
Only in ./libs/libmythtv: jobqueue.o
Only in ./libs/libmythtv: lang.o
Only in ./libs/libmythtv: libmythtv-0.16.so
Only in ./libs/libmythtv: libmythtv-0.16.so.0
Only in ./libs/libmythtv: libmythtv-0.16.so.0.16
Only in ./libs/libmythtv: libmythtv-0.16.so.0.16.0
Only in ./libs/libmythtv: minilzo.o
Only in ./libs/libmythtv: moc_channeleditor.cpp
Only in ./libs/libmythtv: moc_channeleditor.o
Only in ./libs/libmythtv: moc_channelsettings.cpp
Only in ./libs/libmythtv: moc_channelsettings.o
Only in ./libs/libmythtv: moc_dvbcam.cpp
Only in ./libs/libmythtv: moc_dvbcam.o
Only in ./libs/libmythtv: moc_dvbchannel.cpp
Only in ./libs/libmythtv: moc_dvbchannel.o
Only in ./libs/libmythtv: moc_dvbrecorder.cpp
Only in ./libs/libmythtv: moc_dvbrecorder.o
Only in ./libs/libmythtv: moc_dvbsignalmonitor.cpp
Only in ./libs/libmythtv: moc_dvbsignalmonitor.o
Only in ./libs/libmythtv: moc_dvbtransporteditor.cpp
Only in ./libs/libmythtv: moc_dvbtransporteditor.o
Only in ./libs/libmythtv: moc_guidegrid.cpp
Only in ./libs/libmythtv: moc_guidegrid.o
Only in ./libs/libmythtv: moc_osd.cpp
Only in ./libs/libmythtv: moc_osdlistbtntype.cpp
Only in ./libs/libmythtv: moc_osdlistbtntype.o
Only in ./libs/libmythtv: moc_osd.o
Only in ./libs/libmythtv: moc_osdtypes.cpp
Only in ./libs/libmythtv: moc_osdtypes.o
Only in ./libs/libmythtv: moc_profilegroup.cpp
Only in ./libs/libmythtv: moc_profilegroup.o
Only in ./libs/libmythtv: moc_progfind.cpp
Only in ./libs/libmythtv: moc_progfind.o
Only in ./libs/libmythtv: moc_proglist.cpp
Only in ./libs/libmythtv: moc_proglist.o
Only in ./libs/libmythtv: moc_recordingprofile.cpp
Only in ./libs/libmythtv: moc_recordingprofile.o
Only in ./libs/libmythtv: moc_scanwizard.cpp
Only in ./libs/libmythtv: moc_scanwizard.o
Only in ./libs/libmythtv: moc_scheduledrecording.cpp
Only in ./libs/libmythtv: moc_scheduledrecording.o
Only in ./libs/libmythtv: moc_siparser.cpp
Only in ./libs/libmythtv: moc_siparser.o
Only in ./libs/libmythtv: moc_siscan.cpp
Only in ./libs/libmythtv: moc_siscan.o
Only in ./libs/libmythtv: moc_sr_dialog.cpp
Only in ./libs/libmythtv: moc_sr_dialog.o
Only in ./libs/libmythtv: moc_sr_items.cpp
Only in ./libs/libmythtv: moc_sr_items.o
Only in ./libs/libmythtv: moc_sr_root.cpp
Only in ./libs/libmythtv: moc_sr_root.o
Only in ./libs/libmythtv: moc_tv_play.cpp
Only in ./libs/libmythtv: moc_tv_play.o
Only in ./libs/libmythtv: moc_udpnotify.cpp
Only in ./libs/libmythtv: moc_udpnotify.o
Only in ./libs/libmythtv: moc_videosource.cpp
Only in ./libs/libmythtv: moc_videosource.o
Only in ./libs/libmythtv: moc_xbox.cpp
Only in ./libs/libmythtv: moc_xbox.o
Only in ./libs/libmythtv: mpegrecorder.o
Only in ./libs/libmythtv: mpegstreamdata.o
Only in ./libs/libmythtv: mpegtables.o
Only in ./libs/libmythtv: nuppeldecoder.o
Only in ./libs/libmythtv: NuppelVideoPlayer.o
Only in ./libs/libmythtv: NuppelVideoRecorder.o
Only in ./libs/libmythtv: osdlistbtntype.o
Only in ./libs/libmythtv: osd.o
Only in ./libs/libmythtv: osdsurface.o
Only in ./libs/libmythtv: osdtypes.o
Only in ./libs/libmythtv: pespacket.o
Only in ./libs/libmythtv: profilegroup.o
Only in ./libs/libmythtv: progfind.o
Only in ./libs/libmythtv: proglist.o
Only in ./libs/libmythtv: programinfo.o
Only in ./libs/libmythtv: recorderbase.o
Only in ./libs/libmythtv: recordingprofile.o
Only in ./libs/libmythtv: recordingtypes.o
Only in ./libs/libmythtv: remoteencoder.o
Only in ./libs/libmythtv: remoteutil.o
Only in ./libs/libmythtv: RingBuffer.o
Only in ./libs/libmythtv: ringbuffy.o
Only in ./libs/libmythtv: RTjpegN.o
Only in ./libs/libmythtv: scanwizard.o
Only in ./libs/libmythtv: scheduledrecording.o
Only in ./libs/libmythtv: siparser.o
Only in ./libs/libmythtv: siscan.o
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/libs/libmythtv/sitypes.h ./libs/libmythtv/sitypes.h
--- ../mythtv.orig/libs/libmythtv/sitypes.h	2005-01-04 18:11:33.000000000 +1100
+++ ./libs/libmythtv/sitypes.h	2005-01-14 20:15:24.000000000 +1100
@@ -509,29 +509,27 @@ class PMTObject 
 
         // Try to auto detect which audio stream to use
         // (Can go away when we can record them all)
-        ElementaryPIDObject *PreferredAudioStream()
+        ElementaryPIDObject *PreferredAudioStream(bool prefer_ac3 = false)
         {
             QValueList<ElementaryPIDObject>::Iterator pit;
-            
-            // Change this if you prefer AC3 over PCM, and are not using TS recording
-            bool prefer_ac3 = false;            
+            int desiredCodec = ES_TYPE_AUDIO_PCM;
+            // Change this if you prefer AC3 over PCM, 
+            // and are not using TS recording.
             if (prefer_ac3)
             {
-                for (pit = Components.begin(); pit != Components.end(); ++pit)
-                    if ((*pit).Record && ((*pit).Type == ES_TYPE_AUDIO_AC3))
-                        return &(*pit);
+                desiredCodec = ES_TYPE_AUDIO_AC3;	
             }
-
-            // Use first PCM stream
             for (pit = Components.begin(); pit != Components.end(); ++pit)
-                if ((*pit).Record && ((*pit).Type == ES_TYPE_AUDIO_PCM))
-                    return &(*pit);
-
-            // No PCM found - look for AC3
-            for (pit = Components.begin(); pit != Components.end(); ++pit)
-                if ((*pit).Record && ((*pit).Type == ES_TYPE_AUDIO_AC3))
+            {
+                if ((*pit).Record && ((*pit).Type == desiredCodec))
+                {
                     return &(*pit);
-
+                }
+            }
+            if (prefer_ac3)
+            {
+                return PreferredAudioStream(false);
+            }
             return NULL;
         }
 
Only in ./libs/libmythtv: sr_dialog.o
Only in ./libs/libmythtv: sr_items.o
Only in ./libs/libmythtv: sr_root.o
Only in ./libs/libmythtv: transform.o
Only in ./libs/libmythtv: tspacket.o
Only in ./libs/libmythtv: ttfont.o
Only in ./libs/libmythtv: tv_play.o
Only in ./libs/libmythtv: tv_rec.o
Only in ./libs/libmythtv: udpnotify.o
Only in ./libs/libmythtv: vbi.o
Only in ./libs/libmythtv: videooutbase.o
Only in ./libs/libmythtv: videoout_ivtv.o
Only in ./libs/libmythtv: videoout_null.o
Only in ./libs/libmythtv: videoout_xvmc.o
Only in ./libs/libmythtv: videoout_xv.o
Only in ./libs/libmythtv: videosource.o
Only in ./libs/libmythtv: vsync.o
Only in ./libs/libmythtv: xbox.o
Only in ./libs/libmythtv: XvMCSurfaceTypes.o
Only in ./libs/libmythtv: yuv2rgb.o
Only in .: oz-ac3-bigdvb3.5v6.diff
Only in ./programs/mythbackend: autoexpire.o
Only in ./programs/mythbackend: encoderlink.o
Only in ./programs/mythbackend: filetransfer.o
Only in ./programs/mythbackend: housekeeper.o
Only in ./programs/mythbackend: httpstatus.o
Only in ./programs/mythbackend: main.o
Only in ./programs/mythbackend: mainserver.o
Only in ./programs/mythbackend: moc_httpstatus.cpp
Only in ./programs/mythbackend: moc_httpstatus.o
Only in ./programs/mythbackend: moc_mainserver.cpp
Only in ./programs/mythbackend: moc_mainserver.o
Only in ./programs/mythbackend: moc_server.cpp
Only in ./programs/mythbackend: moc_server.o
Only in ./programs/mythbackend: mythbackend
Only in ./programs/mythbackend: playbacksock.o
Only in ./programs/mythbackend: scheduler.o
Only in ./programs/mythbackend: server.o
Only in ./programs/mythcommflag: main.o
Only in ./programs/mythcommflag: mythcommflag
Only in ./programs/mythepg: main.o
Only in ./programs/mythepg: mythepg
Only in ./programs/mythfilldatabase: filldata.o
Only in ./programs/mythfilldatabase: mythfilldatabase
Only in ./programs/mythfrontend: channelrecpriority.o
Only in ./programs/mythfrontend: customrecord.o
diff -Bbupr -xconfig.log -xconfig.mak -xMakefile ../mythtv.orig/programs/mythfrontend/globalsettings.cpp ./programs/mythfrontend/globalsettings.cpp
--- ../mythtv.orig/programs/mythfrontend/globalsettings.cpp	2004-12-20 05:26:28.000000000 +1100
+++ ./programs/mythfrontend/globalsettings.cpp	2005-01-14 18:13:47.000000000 +1100
@@ -184,6 +184,17 @@ static GenericCheckBox *IndividualMuteCo
     return gc;
 }
 
+static GenericCheckBox *WantAC3()
+{
+    GenericCheckBox *gc = new GenericCheckBox("WantAC3");
+    gc->setLabel(QObject::tr("Use Dolby digital audio where available"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr("Where a Dolby digital sound track is "
+			"available (usually digital TV) use it. If this is not"
+			" set then Dolby audio will be disabled"));
+    return gc;
+}
+
 static GenericCheckBox *AC3PassThrough()
 {
     GenericCheckBox *gc = new GenericCheckBox("AC3PassThru");
@@ -1880,6 +1891,7 @@ public:
          setUseLabel(false);
 
          addChild(AudioOutputDevice());
+         addChild(WantAC3());
          addChild(AC3PassThrough());
          addChild(AggressiveBuffer());
 
Only in ./programs/mythfrontend: globalsettings.o
Only in ./programs/mythfrontend: main.o
Only in ./programs/mythfrontend: manualbox.o
Only in ./programs/mythfrontend: manualschedule.o
Only in ./programs/mythfrontend: moc_channelrecpriority.cpp
Only in ./programs/mythfrontend: moc_channelrecpriority.o
Only in ./programs/mythfrontend: moc_customrecord.cpp
Only in ./programs/mythfrontend: moc_customrecord.o
Only in ./programs/mythfrontend: moc_manualbox.cpp
Only in ./programs/mythfrontend: moc_manualbox.o
Only in ./programs/mythfrontend: moc_manualschedule.cpp
Only in ./programs/mythfrontend: moc_manualschedule.o
Only in ./programs/mythfrontend: moc_playbackbox.cpp
Only in ./programs/mythfrontend: moc_playbackbox.o
Only in ./programs/mythfrontend: moc_previousbox.cpp
Only in ./programs/mythfrontend: moc_previousbox.o
Only in ./programs/mythfrontend: moc_programrecpriority.cpp
Only in ./programs/mythfrontend: moc_programrecpriority.o
Only in ./programs/mythfrontend: moc_statusbox.cpp
Only in ./programs/mythfrontend: moc_statusbox.o
Only in ./programs/mythfrontend: moc_viewscheduled.cpp
Only in ./programs/mythfrontend: moc_viewscheduled.o
Only in ./programs/mythfrontend: mythfrontend
Only in ./programs/mythfrontend: playbackbox.o
Only in ./programs/mythfrontend: previousbox.o
Only in ./programs/mythfrontend: programrecpriority.o
Only in ./programs/mythfrontend: statusbox.o
Only in ./programs/mythfrontend: viewscheduled.o
Only in ./programs/mythjobqueue: main.o
Only in ./programs/mythjobqueue: mythjobqueue
Only in ./programs/mythlcd: main.o
Only in ./programs/mythlcd: moc_mythlcd.cpp
Only in ./programs/mythlcd: moc_mythlcd.o
Only in ./programs/mythlcd: mythlcd
Only in ./programs/mythlcd: mythlcd.o
Only in ./programs/mythprogfind: main.o
Only in ./programs/mythprogfind: mythprogfind
Only in ./programs/mythtranscode: main.o
Only in ./programs/mythtranscode: mpeg2trans.o
Only in ./programs/mythtranscode: mythtranscode
Only in ./programs/mythtranscode: transcode.o
Only in ./programs/mythtv: main.o
Only in ./programs/mythtv: mythtv
Only in ./programs/mythtvosd: main.o
Only in ./programs/mythtvosd: mythtvosd
Only in ./setup: backendsettings.o
Only in ./setup: main.o
Only in ./setup: setup
Only in ./themes: dummy.o
Only in ./themes: themes
Only in .: tmp
_______________________________________________
mythtv-dev mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev

Reply via email to