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:
parent
da17b1b643
commit
bba82abbf7
@ -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
2
common
@ -1 +1 @@
|
|||||||
Subproject commit edfb4b44ea433b0b83b8a2f27a6e0bcbccdc3f2f
|
Subproject commit e4b2fe44724e1c1a6e816ae4fbbae43d7f68f1ef
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user