Fix bug: dvd plugin not working.

This commit is contained in:
Johns 2012-02-14 15:12:48 +01:00
parent 6736db082e
commit 5aa826bdb0
3 changed files with 37 additions and 18 deletions

View File

@ -1,5 +1,6 @@
User johns User johns
Fix bug: dvd plugin not working.
Fix bug: used frame-> instead of video_ctx-> for old libav/ffmpeg. Fix bug: used frame-> instead of video_ctx-> for old libav/ffmpeg.
User johns User johns

View File

@ -179,12 +179,12 @@ static int FindAudioSync(const AVPacket * avpkt)
"audio: mpeg%s layer%d bitrate=%d samplerate=%d %d bytes\n", "audio: mpeg%s layer%d bitrate=%d samplerate=%d %d bytes\n",
mpeg25 ? "2.5" : mpeg2 ? "2" : "1", layer, bit_rate, mpeg25 ? "2.5" : mpeg2 ? "2" : "1", layer, bit_rate,
sample_rate, frame_size); sample_rate, frame_size);
if (i + frame_size < avpkt->size - 4) { // check if after this frame a new mpeg frame starts
if (data[i + frame_size] == 0xFF if (i + frame_size < avpkt->size - 3
&& (data[i + frame_size + 1] & 0xFC) == 0xFC) { && data[i + frame_size] == 0xFF
Debug(3, "audio: mpeg1/2 found at %d\n", i); && (data[i + frame_size + 1] & 0xFC) == 0xFC) {
return i; Debug(3, "audio: mpeg1/2 found at %d\n", i);
} return i;
} }
// no valid frame size or no continuation, try next // no valid frame size or no continuation, try next
} }
@ -280,9 +280,17 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
AudioCodecID = CODEC_ID_MP2; AudioCodecID = CODEC_ID_MP2;
} }
// latm header 0x56E0 11bits: 0x2B7 // latm header 0x56E0 11bits: 0x2B7
} else if (data[0] == 0x56 && (data[1] & 0xE0) == 0xE0) { } else if (data[0] == 0x56 && (data[1] & 0xE0) == 0xE0
// && (((data[1] & 0x1F) << 8) + (data[2] & 0xFF)) < size && (((data[1] & 0x1F) << 8) + (data[2] & 0xFF)) < size) {
if (AudioCodecID != CODEC_ID_AAC_LATM) { if (AudioCodecID != CODEC_ID_AAC_LATM) {
#if 0
// test harder check
printf("%d %d\n", (((data[1] & 0x1F) << 8) + (data[2] & 0xFF)),
size);
printf("%p %x %x\n", data,
data[3 + (((data[1] & 0x1F) << 8) + (data[2] & 0xFF))],
data[4 + (((data[1] & 0x1F) << 8) + (data[2] & 0xFF))]);
#endif
Debug(3, "[softhddev]%s: AAC LATM %d\n", __FUNCTION__, id); Debug(3, "[softhddev]%s: AAC LATM %d\n", __FUNCTION__, id);
CodecAudioClose(MyAudioDecoder); CodecAudioClose(MyAudioDecoder);
CodecAudioOpen(MyAudioDecoder, NULL, CODEC_ID_AAC_LATM); CodecAudioOpen(MyAudioDecoder, NULL, CODEC_ID_AAC_LATM);
@ -504,6 +512,19 @@ static void VideoEnqueue(int64_t pts, const void *data, int size)
#endif #endif
} }
/**
** Reset current packet.
*/
static void VideoResetPacket(void)
{
AVPacket *avpkt;
avpkt = &VideoPacketRb[VideoPacketWrite];
avpkt->stream_index = 0;
avpkt->pts = AV_NOPTS_VALUE;
avpkt->dts = AV_NOPTS_VALUE;
}
/** /**
** Finish current packet advance to next. ** Finish current packet advance to next.
** **
@ -542,10 +563,7 @@ static void VideoNextPacket(int codec_id)
VideoDisplayWakeup(); VideoDisplayWakeup();
// intialize next package to use // intialize next package to use
avpkt = &VideoPacketRb[VideoPacketWrite]; VideoResetPacket();
avpkt->stream_index = 0;
avpkt->pts = AV_NOPTS_VALUE;
avpkt->dts = AV_NOPTS_VALUE;
} }
/** /**
@ -891,7 +909,7 @@ int PlayVideo(const uint8_t * data, int size)
l = size - 9 - n; l = size - 9 - n;
while (!*check) { // count leading zeros while (!*check) { // count leading zeros
if (--l < 4) { if (--l < 4) {
Error(_("[softhddev] invalid video packet %d bytes\n"), size); Warning(_("[softhddev] empty video packet %d bytes\n"), size);
return size; return size;
} }
++check; ++check;
@ -1128,10 +1146,10 @@ void Clear(void)
{ {
int i; int i;
VideoNextPacket(VideoCodecID); // terminate work VideoResetPacket(); // terminate work
VideoClearBuffers = 1; VideoClearBuffers = 1;
// FIXME: avcodec_flush_buffers
AudioFlushBuffers(); AudioFlushBuffers();
// FIXME: audio avcodec_flush_buffers, video is done by VideoClearBuffers
for (i = 0; VideoClearBuffers && i < 20; ++i) { for (i = 0; VideoClearBuffers && i < 20; ++i) {
usleep(1 * 1000); usleep(1 * 1000);
@ -1241,7 +1259,7 @@ int Poll(int timeout)
} }
return atomic_read(&VideoPacketsFilled) < VIDEO_PACKET_MAX / 2; return atomic_read(&VideoPacketsFilled) < VIDEO_PACKET_MAX / 2;
} }
return 0; return 1;
} }
/** /**
@ -1316,7 +1334,7 @@ const char *CommandLineHelp(void)
" -d display\tdisplay of x11 server (fe. :0.0)\n" " -d display\tdisplay of x11 server (fe. :0.0)\n"
" -f\t\tstart with fullscreen window (only with window manager)\n" " -f\t\tstart with fullscreen window (only with window manager)\n"
" -g geometry\tx11 window geometry wxh+x+y\n" " -g geometry\tx11 window geometry wxh+x+y\n"
" -x\t\tstart x11 server\n" " -s\t\tstart in suspended mode\n" " -s\t\tstart in suspended mode\n" " -x\t\tstart x11 server\n"
" -w workaround\tenable/disable workarounds\n" " -w workaround\tenable/disable workarounds\n"
"\tno-hw-decoder\t\tdisable hw decoder, use software decoder only\n" "\tno-hw-decoder\t\tdisable hw decoder, use software decoder only\n"
"\tno-mpeg-hw-decoder\tdisable hw decoder for mpeg only\n" "\tno-mpeg-hw-decoder\tdisable hw decoder for mpeg only\n"

View File

@ -42,7 +42,7 @@ extern "C"
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
static const char *const VERSION = "0.4.7"; static const char *const VERSION = "0.4.8";
static const char *const DESCRIPTION = static const char *const DESCRIPTION =
trNOOP("A software and GPU emulated HD device"); trNOOP("A software and GPU emulated HD device");