Folks,
Attached is yet another attempt to get this right. This patches onto cvs from
yesterday, bigdvb3.5 and marcus's trans.dif patch.
1. Finally fixed the TS v's PS audio intitialisation problems. This was done
by changing mpeg.c to use the same audio track for all audio types, this
avoids having audio tracks that contain no data in the stream which allows
avformatdecoder to behave better for PS recording. This has been tested in
both PS and TS recordings and works fine. Tim please confirm you are happy
this time?
2. Changed to default to using AC3. The previous patches required a setting to
be made to enable AC3. This fixes the problem reported earlier by Angel Li in
the US (Swtiching on Dolby audio fixed Angel's problem).
So this patch works on both PS and TS in both australia and the US. Anyone in
Europe want to make it a trifector?
Mark
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-15 16:54:55.490577486 +1100
@@ -1498,12 +1498,6 @@ static int mpegps_read_packet(AVFormatCo
if (len < 0)
return len;
- /* now find stream */
- for(i=0;i<s->nb_streams;i++) {
- st = s->streams[i];
- if (st->id == startcode)
- goto found;
- }
if (startcode >= 0x1e0 && startcode <= 0x1ef) {
type = CODEC_TYPE_VIDEO;
codec_id = CODEC_ID_MPEG2VIDEO;
@@ -1525,15 +1519,46 @@ static int mpegps_read_packet(AVFormatCo
url_fskip(&s->pb, len);
goto redo;
}
+
+ /* now find stream */
+ for(i=0;i<s->nb_streams;i++) {
+ st = s->streams[i];
+ if ((st->id == startcode) ||
+ ((type == CODEC_TYPE_AUDIO) &&
+ (st->codec.codec_type == CODEC_TYPE_AUDIO)))
+ {
+ goto found;
+ }
+ }
+
/* no stream found: add a new stream */
st = av_new_stream(s, startcode);
if (!st)
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);
+ }
+
+ found:
+
+ if ((type == CODEC_TYPE_AUDIO) &&
+ (st->id != startcode))
+ {
+ st->codec.codec_id = codec_id;
+ st->id = startcode;
+ /*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:
if (startcode >= 0xa0 && startcode <= 0xbf) {
int b1, freq;
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-15 16:13:48.196948370 +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", true);
+ }
+
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;
@@ -1275,9 +1303,29 @@ bool AvFormatDecoder::GetFrame(int onlyv
if (firstloop && pkt->pts != (int64_t)AV_NOPTS_VALUE)
lastapts = pkt->pts / (AV_TIME_BASE / 1000);
+ static int packetsWithNewCodec = 0;
+ //hmm the codec has changed from what we were initialised with
+ //move to the next stream to see if it is correct, but only
+ //if we have received x packets with the new codec
+ if ((curstream->codec.codec_id != audio_codec))
+ {
+
+ }
+
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)
+ {
+ packetsWithNewCodec++;
+ if (packetsWithNewCodec > 20)
+ {
+ // incCurrentAudioTrack();
+ packetsWithNewCodec = 0;
+ }
+ }
ptr += pkt->size;
len -= pkt->size;
continue;
@@ -1304,7 +1352,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.000000000 +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.000000000 +1100
+++ ./libs/libmythtv/dvbdev/transform.c 2005-01-14 20:57:17.000000000 +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.000000000 +1100
+++ ./libs/libmythtv/dvbrecorder.cpp 2005-01-15 16:14:18.196728230 +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,8 @@ 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", true));
ElementaryPIDObject *vs = m_pmt.PreferredVideoStream();
ElementaryPIDObject *sub = m_pmt.PreferredSubtitleStream();
@@ -838,7 +840,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 .: oz-ac3-bigdvb3.5v7.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-15 16:37:22.905518196 +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(true);
+ 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