summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward.hervey@collabora.co.uk>2012-05-30 12:50:13 +0200
committerEdward Hervey <edward.hervey@collabora.co.uk>2012-05-30 12:50:44 +0200
commiteea0444f347b76fb2845dd43f6731092c436dbdf (patch)
tree8e666f2890f78da8c4ddbbcdad951200ead4b628
parent98affdd90dd52ed9b77fd2e1bb8dbfec72343b57 (diff)
mpeg2dec: Report PAR if not present upstream
And clean up some code
-rw-r--r--ext/mpeg2dec/gstmpeg2dec.c53
-rw-r--r--ext/mpeg2dec/gstmpeg2dec.h3
2 files changed, 16 insertions, 40 deletions
diff --git a/ext/mpeg2dec/gstmpeg2dec.c b/ext/mpeg2dec/gstmpeg2dec.c
index cab5a53c..33b24f93 100644
--- a/ext/mpeg2dec/gstmpeg2dec.c
+++ b/ext/mpeg2dec/gstmpeg2dec.c
@@ -218,19 +218,12 @@ static gboolean
gst_mpeg2dec_set_format (GstVideoDecoder * decoder, GstVideoCodecState * state)
{
GstMpeg2dec *mpeg2dec = GST_MPEG2DEC (decoder);
- GstStructure *s;
/* Save input state to be used as reference for output state */
if (mpeg2dec->input_state)
gst_video_codec_state_unref (mpeg2dec->input_state);
mpeg2dec->input_state = gst_video_codec_state_ref (state);
- s = gst_caps_get_structure (state->caps, 0);
-
- /* parse the par, this overrides the encoded par */
- mpeg2dec->have_par = gst_structure_get_fraction (s, "pixel-aspect-ratio",
- &mpeg2dec->pixel_width, &mpeg2dec->pixel_height);
-
return TRUE;
}
@@ -486,6 +479,7 @@ gst_mpeg2dec_negotiate_format (GstMpeg2dec * mpeg2dec)
const mpeg2_info_t *info;
const mpeg2_sequence_t *sequence;
gboolean ret = FALSE;
+ GstVideoInfo *vinfo;
info = mpeg2_info (mpeg2dec->decoder);
sequence = info->sequence;
@@ -505,9 +499,12 @@ gst_mpeg2dec_negotiate_format (GstMpeg2dec * mpeg2dec)
new_state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (mpeg2dec),
format, mpeg2dec->width, mpeg2dec->height, mpeg2dec->input_state);
+ vinfo = &new_state->info;
+
/* Ensure interlace caps are set, needed if not using mpegvideoparse */
if (mpeg2dec->interlaced)
- new_state->info.interlace_mode = GST_VIDEO_INTERLACE_MODE_INTERLEAVED;
+ GST_VIDEO_INFO_INTERLACE_MODE (vinfo) =
+ GST_VIDEO_INTERLACE_MODE_INTERLEAVED;
mpeg2dec->size = gst_video_format_get_size (format,
mpeg2dec->decoded_width, mpeg2dec->decoded_height);
@@ -516,31 +513,14 @@ gst_mpeg2dec_negotiate_format (GstMpeg2dec * mpeg2dec)
mpeg2dec->v_offs = gst_video_format_get_component_offset (format, 2,
mpeg2dec->decoded_width, mpeg2dec->decoded_height);
- if (mpeg2dec->pixel_width == 0 || mpeg2dec->pixel_height == 0) {
- GValue par = { 0, };
- GValue dar = { 0, };
- GValue dimensions = { 0, };
-
- /* assume display aspect ratio (DAR) of 4:3 */
- g_value_init (&dar, GST_TYPE_FRACTION);
- gst_value_set_fraction (&dar, 4, 3);
- g_value_init (&dimensions, GST_TYPE_FRACTION);
- gst_value_set_fraction (&dimensions, mpeg2dec->height, mpeg2dec->width);
-
- g_value_init (&par, GST_TYPE_FRACTION);
- if (!gst_value_fraction_multiply (&par, &dar, &dimensions)) {
- gst_value_set_fraction (&dimensions, 1, 1);
- }
-
- mpeg2dec->pixel_width = gst_value_get_fraction_numerator (&par);
- mpeg2dec->pixel_height = gst_value_get_fraction_denominator (&par);
-
- GST_WARNING_OBJECT (mpeg2dec, "Unknown pixel-aspect-ratio, assuming %d:%d",
+ /* If we don't have a valid upstream PAR override it */
+ if (GST_VIDEO_INFO_PAR_N (vinfo) == 1 &&
+ GST_VIDEO_INFO_PAR_D (vinfo) == 1 &&
+ mpeg2dec->pixel_width != 0 && mpeg2dec->pixel_height != 0) {
+ GST_DEBUG_OBJECT (mpeg2dec, "Setting PAR %d x %d",
mpeg2dec->pixel_width, mpeg2dec->pixel_height);
-
- g_value_unset (&par);
- g_value_unset (&dar);
- g_value_unset (&dimensions);
+ GST_VIDEO_INFO_PAR_N (vinfo) = mpeg2dec->pixel_width;
+ GST_VIDEO_INFO_PAR_D (vinfo) = mpeg2dec->pixel_height;
}
if (new_state) {
@@ -580,11 +560,10 @@ handle_sequence (GstMpeg2dec * mpeg2dec, const mpeg2_info_t * info)
mpeg2dec->decoded_width = info->sequence->width;
mpeg2dec->decoded_height = info->sequence->height;
- /* don't take the sequence PAR if we already have one from the sink caps */
- if (!mpeg2dec->have_par) {
- mpeg2dec->pixel_width = info->sequence->pixel_width;
- mpeg2dec->pixel_height = info->sequence->pixel_height;
- }
+ mpeg2dec->pixel_width = info->sequence->pixel_width;
+ mpeg2dec->pixel_height = info->sequence->pixel_height;
+ GST_DEBUG_OBJECT (mpeg2dec, "pixel_width:%d pixel_height:%d",
+ mpeg2dec->pixel_width, mpeg2dec->pixel_height);
/* mpeg2 video can only be from 16x16 to 4096x4096. Everything
* else is a corrupted files */
diff --git a/ext/mpeg2dec/gstmpeg2dec.h b/ext/mpeg2dec/gstmpeg2dec.h
index edeba037..3c4cff02 100644
--- a/ext/mpeg2dec/gstmpeg2dec.h
+++ b/ext/mpeg2dec/gstmpeg2dec.h
@@ -98,9 +98,6 @@ struct _GstMpeg2dec {
gint index_id;
gboolean can_allocate_aligned;
-
- /* whether we have a pixel aspect ratio from the sink caps */
- gboolean have_par;
};
struct _GstMpeg2decClass {