sys/dshowdecwrapper/gstdshowaudiodec.cpp: Fix flushing/seeking problems returning error code.

Original commit message from CVS:
* sys/dshowdecwrapper/gstdshowaudiodec.cpp:
Fix flushing/seeking problems returning error code.
Fix mp3 decoding with winXP (crashed randomly, occasionally).
* sys/dshowdecwrapper/gstdshowvideodec.cpp:
Fix problems when framerate is missing from video.
This commit is contained in:
Michael Smith 2008-11-21 00:47:37 +00:00
parent da17b1b643
commit bba82abbf7
4 changed files with 66 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2008-11-20 Michael Smith <msmith@songbirdnest.com>
* sys/dshowdecwrapper/gstdshowaudiodec.cpp:
Fix flushing/seeking problems returning error code.
Fix mp3 decoding with winXP (crashed randomly, occasionally).
* sys/dshowdecwrapper/gstdshowvideodec.cpp:
Fix problems when framerate is missing from video.
2008-11-20 Wim Taymans <wim.taymans@collabora.co.uk> 2008-11-20 Wim Taymans <wim.taymans@collabora.co.uk>
* gst/rtpmanager/gstrtpsession.c: (get_current_times), * gst/rtpmanager/gstrtpsession.c: (get_current_times),

2
common

@ -1 +1 @@
Subproject commit edfb4b44ea433b0b83b8a2f27a6e0bcbccdc3f2f Subproject commit e4b2fe44724e1c1a6e816ae4fbbae43d7f68f1ef

View File

@ -619,7 +619,9 @@ gst_dshowaudiodec_flush (GstDshowAudioDec * adec)
/* flush dshow decoder and reset timestamp */ /* flush dshow decoder and reset timestamp */
adec->fakesrc->GetOutputPin()->Flush(); adec->fakesrc->GetOutputPin()->Flush();
adec->timestamp = GST_CLOCK_TIME_NONE; adec->timestamp = GST_CLOCK_TIME_NONE;
adec->last_ret = GST_FLOW_OK;
return TRUE; return TRUE;
} }
@ -651,7 +653,7 @@ dshowaudiodec_set_input_format (GstDshowAudioDec *adec, GstCaps *caps)
* decoder which doesn't need this */ * decoder which doesn't need this */
if (adec->layer == 1 || adec->layer == 2) { if (adec->layer == 1 || adec->layer == 2) {
MPEG1WAVEFORMAT *mpeg1_format; MPEG1WAVEFORMAT *mpeg1_format;
int version, samples; int samples, version;
GstStructure *structure = gst_caps_get_structure (caps, 0); GstStructure *structure = gst_caps_get_structure (caps, 0);
size = sizeof (MPEG1WAVEFORMAT); size = sizeof (MPEG1WAVEFORMAT);
@ -702,6 +704,37 @@ dshowaudiodec_set_input_format (GstDshowAudioDec *adec, GstCaps *caps)
{ {
size = sizeof (WAVEFORMATEX) + size = sizeof (WAVEFORMATEX) +
(adec->codec_data ? GST_BUFFER_SIZE (adec->codec_data) : 0); (adec->codec_data ? GST_BUFFER_SIZE (adec->codec_data) : 0);
if (adec->layer == 3) {
MPEGLAYER3WAVEFORMAT *mp3format;
/* The WinXP mp3 decoder doesn't actually check the size of this structure,
* but requires that this be allocated and filled out (or we get obscure
* random crashes)
*/
size = sizeof (MPEGLAYER3WAVEFORMAT);
mp3format = (MPEGLAYER3WAVEFORMAT *)g_malloc0 (size);
format = (WAVEFORMATEX *)mp3format;
format->cbSize = MPEGLAYER3_WFX_EXTRA_BYTES;
mp3format->wID = MPEGLAYER3_ID_MPEG;
mp3format->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; /* No idea what this means for a decoder */
/* The XP decoder divides by nBlockSize, so we must set this to a
non-zero value, but it doesn't matter what - this is meaningless
for VBR mp3 anyway */
mp3format->nBlockSize = 1;
mp3format->nFramesPerBlock = 1;
mp3format->nCodecDelay = 0;
/* The XP decoder also has problems with some MP3 frames. If it tries
* to decode one, then forever after it outputs silence.
* If we recognise such a frame, just skip decoding it.
*/
if (adec->decoder_is_xp_mp3)
adec->check_mp3_frames = TRUE;
}
else {
format = (WAVEFORMATEX *)g_malloc0 (size); format = (WAVEFORMATEX *)g_malloc0 (size);
if (adec->codec_data) { /* Codec data is appended after our header */ if (adec->codec_data) { /* Codec data is appended after our header */
memcpy (((guchar *) format) + sizeof (WAVEFORMATEX), memcpy (((guchar *) format) + sizeof (WAVEFORMATEX),
@ -709,6 +742,7 @@ dshowaudiodec_set_input_format (GstDshowAudioDec *adec, GstCaps *caps)
GST_BUFFER_SIZE (adec->codec_data)); GST_BUFFER_SIZE (adec->codec_data));
format->cbSize = GST_BUFFER_SIZE (adec->codec_data); format->cbSize = GST_BUFFER_SIZE (adec->codec_data);
} }
}
format->wFormatTag = codec_entry->format; format->wFormatTag = codec_entry->format;
format->nChannels = adec->channels; format->nChannels = adec->channels;

View File

@ -539,13 +539,16 @@ gst_dshowvideodec_sink_setcaps (GstPad * pad, GstCaps * caps)
goto end; goto end;
} }
fps = gst_structure_get_value (s, "framerate"); fps = gst_structure_get_value (s, "framerate");
if (!fps) { if (fps) {
GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION,
("error getting video framerate from caps"), (NULL));
goto end;
}
vdec->fps_n = gst_value_get_fraction_numerator (fps); vdec->fps_n = gst_value_get_fraction_numerator (fps);
vdec->fps_d = gst_value_get_fraction_denominator (fps); vdec->fps_d = gst_value_get_fraction_denominator (fps);
}
else {
/* Invent a sane default framerate; the timestamps matter
* more anyway. */
vdec->fps_n = 25;
vdec->fps_d = 1;
}
if ((v = gst_structure_get_value (s, "codec_data"))) if ((v = gst_structure_get_value (s, "codec_data")))
extradata = gst_value_get_buffer (v); extradata = gst_value_get_buffer (v);
@ -691,8 +694,13 @@ gst_dshowvideodec_sink_setcaps (GstPad * pad, GstCaps * caps)
caps_out = gst_caps_from_string (klass->entry->srccaps); caps_out = gst_caps_from_string (klass->entry->srccaps);
gst_caps_set_simple (caps_out, gst_caps_set_simple (caps_out,
"width", G_TYPE_INT, vdec->width, "width", G_TYPE_INT, vdec->width,
"height", G_TYPE_INT, vdec->height, "height", G_TYPE_INT, vdec->height, NULL);
if (vdec->fps_n && vdec->fps_d) {
gst_caps_set_simple (caps_out,
"framerate", GST_TYPE_FRACTION, vdec->fps_n, vdec->fps_d, NULL); "framerate", GST_TYPE_FRACTION, vdec->fps_n, vdec->fps_d, NULL);
}
if (!gst_pad_set_caps (vdec->srcpad, caps_out)) { if (!gst_pad_set_caps (vdec->srcpad, caps_out)) {
gst_caps_unref (caps_out); gst_caps_unref (caps_out);
GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION,