mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
asfdemux: Keep audio error checking fields only for audio
Video shouldn't need to be descrambled, this can cause frames data to be corrupted https://bugzilla.gnome.org/show_bug.cgi?id=684942
This commit is contained in:
parent
94a183a071
commit
3de558d96b
2 changed files with 34 additions and 34 deletions
|
@ -1657,7 +1657,7 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force)
|
||||||
/* We have the whole packet now so we should push the packet to
|
/* We have the whole packet now so we should push the packet to
|
||||||
* the src pad now. First though we should check if we need to do
|
* the src pad now. First though we should check if we need to do
|
||||||
* descrambling */
|
* descrambling */
|
||||||
if (G_UNLIKELY (demux->span > 1)) {
|
if (G_UNLIKELY (stream->span > 1)) {
|
||||||
gst_asf_demux_descramble_buffer (demux, stream, &payload->buf);
|
gst_asf_demux_descramble_buffer (demux, stream, &payload->buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2376,7 +2376,7 @@ gst_asf_demux_get_stream (GstASFDemux * demux, guint16 id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static AsfStream *
|
||||||
gst_asf_demux_setup_pad (GstASFDemux * demux, GstPad * src_pad,
|
gst_asf_demux_setup_pad (GstASFDemux * demux, GstPad * src_pad,
|
||||||
GstCaps * caps, guint16 id, gboolean is_video, GstTagList * tags)
|
GstCaps * caps, guint16 id, gboolean is_video, GstTagList * tags)
|
||||||
{
|
{
|
||||||
|
@ -2418,9 +2418,11 @@ gst_asf_demux_setup_pad (GstASFDemux * demux, GstPad * src_pad,
|
||||||
++demux->num_streams;
|
++demux->num_streams;
|
||||||
|
|
||||||
stream->active = FALSE;
|
stream->active = FALSE;
|
||||||
|
|
||||||
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static AsfStream *
|
||||||
gst_asf_demux_add_audio_stream (GstASFDemux * demux,
|
gst_asf_demux_add_audio_stream (GstASFDemux * demux,
|
||||||
asf_stream_audio * audio, guint16 id, guint8 ** p_data, guint64 * p_size)
|
asf_stream_audio * audio, guint16 id, guint8 ** p_data, guint64 * p_size)
|
||||||
{
|
{
|
||||||
|
@ -2476,10 +2478,10 @@ gst_asf_demux_add_audio_stream (GstASFDemux * demux,
|
||||||
|
|
||||||
++demux->num_audio_streams;
|
++demux->num_audio_streams;
|
||||||
|
|
||||||
gst_asf_demux_setup_pad (demux, src_pad, caps, id, FALSE, tags);
|
return gst_asf_demux_setup_pad (demux, src_pad, caps, id, FALSE, tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static AsfStream *
|
||||||
gst_asf_demux_add_video_stream (GstASFDemux * demux,
|
gst_asf_demux_add_video_stream (GstASFDemux * demux,
|
||||||
asf_stream_video_format * video, guint16 id,
|
asf_stream_video_format * video, guint16 id,
|
||||||
guint8 ** p_data, guint64 * p_size)
|
guint8 ** p_data, guint64 * p_size)
|
||||||
|
@ -2561,7 +2563,7 @@ gst_asf_demux_add_video_stream (GstASFDemux * demux,
|
||||||
|
|
||||||
++demux->num_video_streams;
|
++demux->num_video_streams;
|
||||||
|
|
||||||
gst_asf_demux_setup_pad (demux, src_pad, caps, id, TRUE, tags);
|
return gst_asf_demux_setup_pad (demux, src_pad, caps, id, TRUE, tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2620,7 +2622,7 @@ gst_asf_demux_parse_stream_object (GstASFDemux * demux, guint8 * data,
|
||||||
guint type_specific_size G_GNUC_UNUSED;
|
guint type_specific_size G_GNUC_UNUSED;
|
||||||
guint unknown G_GNUC_UNUSED;
|
guint unknown G_GNUC_UNUSED;
|
||||||
gboolean inspect_payload = FALSE;
|
gboolean inspect_payload = FALSE;
|
||||||
AsfStream *stream;
|
AsfStream *stream = NULL;
|
||||||
|
|
||||||
/* Get the rest of the header's header */
|
/* Get the rest of the header's header */
|
||||||
if (size < (16 + 16 + 8 + 4 + 4 + 2 + 4))
|
if (size < (16 + 16 + 8 + 4 + 4 + 2 + 4))
|
||||||
|
@ -2674,7 +2676,7 @@ gst_asf_demux_parse_stream_object (GstASFDemux * demux, guint8 * data,
|
||||||
GST_INFO ("Object is an audio stream with %u bytes of additional data",
|
GST_INFO ("Object is an audio stream with %u bytes of additional data",
|
||||||
audio_object.size);
|
audio_object.size);
|
||||||
|
|
||||||
gst_asf_demux_add_audio_stream (demux, &audio_object, stream_id,
|
stream = gst_asf_demux_add_audio_stream (demux, &audio_object, stream_id,
|
||||||
&data, &size);
|
&data, &size);
|
||||||
|
|
||||||
switch (correction_type) {
|
switch (correction_type) {
|
||||||
|
@ -2692,26 +2694,25 @@ gst_asf_demux_parse_stream_object (GstASFDemux * demux, guint8 * data,
|
||||||
data_size = gst_asf_demux_get_uint16 (&data, &size);
|
data_size = gst_asf_demux_get_uint16 (&data, &size);
|
||||||
silence_data = gst_asf_demux_get_uint8 (&data, &size);
|
silence_data = gst_asf_demux_get_uint8 (&data, &size);
|
||||||
|
|
||||||
/* FIXME: shouldn't this be per-stream? */
|
stream->span = span;
|
||||||
demux->span = span;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (demux, "Descrambling ps:%u cs:%u ds:%u s:%u sd:%u",
|
GST_DEBUG_OBJECT (demux, "Descrambling ps:%u cs:%u ds:%u s:%u sd:%u",
|
||||||
packet_size, chunk_size, data_size, span, silence_data);
|
packet_size, chunk_size, data_size, span, silence_data);
|
||||||
|
|
||||||
if (demux->span > 1) {
|
if (stream->span > 1) {
|
||||||
if (chunk_size == 0 || ((packet_size / chunk_size) <= 1)) {
|
if (chunk_size == 0 || ((packet_size / chunk_size) <= 1)) {
|
||||||
/* Disable descrambling */
|
/* Disable descrambling */
|
||||||
demux->span = 0;
|
stream->span = 0;
|
||||||
} else {
|
} else {
|
||||||
/* FIXME: this else branch was added for
|
/* FIXME: this else branch was added for
|
||||||
* weird_al_yankovic - the saga begins.asf */
|
* weird_al_yankovic - the saga begins.asf */
|
||||||
demux->ds_packet_size = packet_size;
|
stream->ds_packet_size = packet_size;
|
||||||
demux->ds_chunk_size = chunk_size;
|
stream->ds_chunk_size = chunk_size;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Descambling is enabled */
|
/* Descambling is enabled */
|
||||||
demux->ds_packet_size = packet_size;
|
stream->ds_packet_size = packet_size;
|
||||||
demux->ds_chunk_size = chunk_size;
|
stream->ds_chunk_size = chunk_size;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
/* Now skip the rest of the silence data */
|
/* Now skip the rest of the silence data */
|
||||||
|
@ -2760,8 +2761,8 @@ gst_asf_demux_parse_stream_object (GstASFDemux * demux, guint8 * data,
|
||||||
goto not_enough_data;
|
goto not_enough_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_asf_demux_add_video_stream (demux, &video_format_object, stream_id,
|
stream = gst_asf_demux_add_video_stream (demux, &video_format_object,
|
||||||
&data, &size);
|
stream_id, &data, &size);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2774,7 +2775,6 @@ gst_asf_demux_parse_stream_object (GstASFDemux * demux, guint8 * data,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
stream = gst_asf_demux_get_stream (demux, stream_id);
|
|
||||||
if (stream)
|
if (stream)
|
||||||
stream->inspect_payload = inspect_payload;
|
stream->inspect_payload = inspect_payload;
|
||||||
return stream;
|
return stream;
|
||||||
|
@ -4092,25 +4092,25 @@ gst_asf_demux_descramble_buffer (GstASFDemux * demux, AsfStream * stream,
|
||||||
scrambled_buffer = *p_buffer;
|
scrambled_buffer = *p_buffer;
|
||||||
|
|
||||||
if (gst_buffer_get_size (scrambled_buffer) <
|
if (gst_buffer_get_size (scrambled_buffer) <
|
||||||
demux->ds_packet_size * demux->span)
|
stream->ds_packet_size * stream->span)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (offset = 0; offset < gst_buffer_get_size (scrambled_buffer);
|
for (offset = 0; offset < gst_buffer_get_size (scrambled_buffer);
|
||||||
offset += demux->ds_chunk_size) {
|
offset += stream->ds_chunk_size) {
|
||||||
off = offset / demux->ds_chunk_size;
|
off = offset / stream->ds_chunk_size;
|
||||||
row = off / demux->span;
|
row = off / stream->span;
|
||||||
col = off % demux->span;
|
col = off % stream->span;
|
||||||
idx = row + col * demux->ds_packet_size / demux->ds_chunk_size;
|
idx = row + col * stream->ds_packet_size / stream->ds_chunk_size;
|
||||||
GST_DEBUG ("idx=%u, row=%u, col=%u, off=%u, ds_chunk_size=%u", idx, row,
|
GST_DEBUG ("idx=%u, row=%u, col=%u, off=%u, ds_chunk_size=%u", idx, row,
|
||||||
col, off, demux->ds_chunk_size);
|
col, off, stream->ds_chunk_size);
|
||||||
GST_DEBUG ("scrambled buffer size=%" G_GSIZE_FORMAT
|
GST_DEBUG ("scrambled buffer size=%" G_GSIZE_FORMAT
|
||||||
", span=%u, packet_size=%u", gst_buffer_get_size (scrambled_buffer),
|
", span=%u, packet_size=%u", gst_buffer_get_size (scrambled_buffer),
|
||||||
demux->span, demux->ds_packet_size);
|
stream->span, stream->ds_packet_size);
|
||||||
GST_DEBUG ("gst_buffer_get_size (scrambled_buffer) = %" G_GSIZE_FORMAT,
|
GST_DEBUG ("gst_buffer_get_size (scrambled_buffer) = %" G_GSIZE_FORMAT,
|
||||||
gst_buffer_get_size (scrambled_buffer));
|
gst_buffer_get_size (scrambled_buffer));
|
||||||
sub_buffer =
|
sub_buffer =
|
||||||
gst_buffer_copy_region (scrambled_buffer, GST_BUFFER_COPY_MEMORY,
|
gst_buffer_copy_region (scrambled_buffer, GST_BUFFER_COPY_MEMORY,
|
||||||
idx * demux->ds_chunk_size, demux->ds_chunk_size);
|
idx * stream->ds_chunk_size, stream->ds_chunk_size);
|
||||||
if (!offset) {
|
if (!offset) {
|
||||||
descrambled_buffer = sub_buffer;
|
descrambled_buffer = sub_buffer;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -99,6 +99,12 @@ typedef struct
|
||||||
|
|
||||||
gboolean discont;
|
gboolean discont;
|
||||||
|
|
||||||
|
/* Descrambler settings */
|
||||||
|
guint8 span;
|
||||||
|
guint16 ds_packet_size;
|
||||||
|
guint16 ds_chunk_size;
|
||||||
|
guint16 ds_data_size;
|
||||||
|
|
||||||
/* for new parsing code */
|
/* for new parsing code */
|
||||||
GstFlowReturn last_flow; /* last flow return */
|
GstFlowReturn last_flow; /* last flow return */
|
||||||
GArray *payloads; /* pending payloads */
|
GArray *payloads; /* pending payloads */
|
||||||
|
@ -190,12 +196,6 @@ struct _GstASFDemux {
|
||||||
gboolean streaming; /* TRUE if we are operating chain-based */
|
gboolean streaming; /* TRUE if we are operating chain-based */
|
||||||
GstClockTime latency;
|
GstClockTime latency;
|
||||||
|
|
||||||
/* Descrambler settings */
|
|
||||||
guint8 span;
|
|
||||||
guint16 ds_packet_size;
|
|
||||||
guint16 ds_chunk_size;
|
|
||||||
guint16 ds_data_size;
|
|
||||||
|
|
||||||
/* for debugging only */
|
/* for debugging only */
|
||||||
gchar *objpath;
|
gchar *objpath;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue