diff options
author | Michael Smith <msmith@xiph.org> | 2005-11-22 17:09:36 +0000 |
---|---|---|
committer | Michael Smith <msmith@xiph.org> | 2005-11-22 17:09:36 +0000 |
commit | efe4bc244daf74c1e7c1b25b69caa18750617e7f (patch) | |
tree | b14bba4de66fc1237a523fd52b8668e56a9358d3 /ext/dv/gstdvdemux.c | |
parent | e8464db22f5e18ba075bdaa59cf8496fa54709f7 (diff) |
ext/dv/: Fractional framerates for DV.
Original commit message from CVS:
* ext/dv/gstdvdec.c: (gst_dvdec_init), (gst_dvdec_sink_setcaps):
* ext/dv/gstdvdec.h:
* ext/dv/gstdvdemux.c: (gst_dvdemux_init),
(gst_dvdemux_src_convert), (gst_dvdemux_sink_convert),
(gst_dvdemux_demux_video), (gst_dvdemux_demux_frame),
(gst_dvdemux_flush):
* ext/dv/gstdvdemux.h:
Fractional framerates for DV.
Diffstat (limited to 'ext/dv/gstdvdemux.c')
-rw-r--r-- | ext/dv/gstdvdemux.c | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c index 882b270f..f7f90f80 100644 --- a/ext/dv/gstdvdemux.c +++ b/ext/dv/gstdvdemux.c @@ -66,11 +66,13 @@ #define NTSC_HEIGHT 480 #define NTSC_BUFFER 120000 -#define NTSC_FRAMERATE 30000/1001. +#define NTSC_FRAMERATE_NUMERATOR 30000 +#define NTSC_FRAMERATE_DENOMINATOR 1001 #define PAL_HEIGHT 576 #define PAL_BUFFER 144000 -#define PAL_FRAMERATE 25.0 +#define PAL_FRAMERATE_NUMERATOR 25 +#define PAL_FRAMERATE_DENOMINATOR 1 #define PAL_NORMAL_PAR_X 59 #define PAL_NORMAL_PAR_Y 54 @@ -187,7 +189,9 @@ gst_dvdemux_init (GstDVDemux * dvdemux, GstDVDemuxClass * g_class) dvdemux->stop_timestamp = -1LL; dvdemux->need_discont = FALSE; dvdemux->new_media = FALSE; - dvdemux->framerate = 0; + dvdemux->framerate_numerator = 0; + dvdemux->framerate_denominator = 0; + dvdemux->total_frames = 0; dvdemux->height = 0; dvdemux->frequency = 0; dvdemux->channels = 0; @@ -263,8 +267,9 @@ gst_dvdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, case GST_FORMAT_TIME: *dest_format = GST_FORMAT_TIME; if (pad == dvdemux->videosrcpad) - *dest_value = src_value * GST_SECOND / - (dvdemux->frame_len * dvdemux->framerate); + *dest_value = src_value * GST_SECOND * + dvdemux->framerate_denominator / + (dvdemux->frame_len * dvdemux->framerate_numerator); else if (pad == dvdemux->audiosrcpad) *dest_value = src_value * GST_SECOND / (2 * dvdemux->frequency * dvdemux->channels); @@ -277,8 +282,9 @@ gst_dvdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, switch (*dest_format) { case GST_FORMAT_BYTES: if (pad == dvdemux->videosrcpad) - *dest_value = src_value * dvdemux->frame_len * dvdemux->framerate - / GST_SECOND; + *dest_value = src_value * dvdemux->frame_len * + dvdemux->framerate_numerator / + (dvdemux->framerate_denominator * GST_SECOND); else if (pad == dvdemux->audiosrcpad) *dest_value = 2 * src_value * dvdemux->frequency * dvdemux->channels / GST_SECOND; @@ -286,7 +292,8 @@ gst_dvdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, case GST_FORMAT_DEFAULT: if (pad == dvdemux->videosrcpad) { if (src_value) - *dest_value = src_value * dvdemux->framerate / GST_SECOND; + *dest_value = src_value * dvdemux->framerate_numerator / + (dvdemux->framerate_denominator * GST_SECOND); else *dest_value = 0; } else if (pad == dvdemux->audiosrcpad) { @@ -303,7 +310,8 @@ gst_dvdemux_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, switch (*dest_format) { case GST_FORMAT_TIME: if (pad == dvdemux->videosrcpad) { - *dest_value = src_value * GST_SECOND / dvdemux->framerate; + *dest_value = src_value * GST_SECOND * + dvdemux->framerate_denominator / dvdemux->framerate_numerator; } else if (pad == dvdemux->audiosrcpad) { if (src_value) *dest_value = @@ -376,7 +384,8 @@ gst_dvdemux_sink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, /* get frame number */ frame = src_value / dvdemux->frame_len; - *dest_value = (frame * GST_SECOND) / dvdemux->framerate; + *dest_value = (frame * GST_SECOND * dvdemux->framerate_denominator) / + dvdemux->framerate_numerator; break; } default: @@ -390,7 +399,8 @@ gst_dvdemux_sink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, guint64 frame; /* calculate the frame */ - frame = src_value * dvdemux->framerate / GST_SECOND; + frame = src_value * dvdemux->framerate_numerator / + (dvdemux->framerate_denominator * GST_SECOND); /* calculate the offset */ *dest_value = frame * dvdemux->frame_len; break; @@ -825,7 +835,8 @@ gst_dvdemux_demux_video (GstDVDemux * dvdemux, const guint8 * data) "systemstream", G_TYPE_BOOLEAN, FALSE, "width", G_TYPE_INT, 720, "height", G_TYPE_INT, height, - "framerate", G_TYPE_DOUBLE, dvdemux->framerate, + "framerate", GST_TYPE_FRACTION, dvdemux->framerate_numerator, + dvdemux->framerate_denominator, "pixel-aspect-ratio", GST_TYPE_FRACTION, par_x, par_y, NULL); gst_pad_set_caps (dvdemux->videosrcpad, caps); gst_caps_unref (caps); @@ -893,7 +904,10 @@ gst_dvdemux_demux_frame (GstDVDemux * dvdemux, const guint8 * data) dvdemux->need_discont = FALSE; } - next_ts = dvdemux->timestamp + GST_SECOND / dvdemux->framerate; + dvdemux->total_frames++; + + next_ts = dvdemux->total_frames * GST_SECOND * + dvdemux->framerate_denominator / dvdemux->framerate_numerator; dvdemux->duration = next_ts - dvdemux->timestamp; dv_parse_packs (dvdemux->decoder, data); @@ -948,7 +962,13 @@ gst_dvdemux_flush (GstDVDemux * dvdemux) /* after parsing the header we know the length of the data */ dvdemux->PAL = dv_system_50_fields (dvdemux->decoder); length = dvdemux->frame_len = (dvdemux->PAL ? PAL_BUFFER : NTSC_BUFFER); - dvdemux->framerate = dvdemux->PAL ? PAL_FRAMERATE : NTSC_FRAMERATE; + if (dvdemux->PAL) { + dvdemux->framerate_numerator = PAL_FRAMERATE_NUMERATOR; + dvdemux->framerate_denominator = PAL_FRAMERATE_DENOMINATOR; + } else { + dvdemux->framerate_numerator = NTSC_FRAMERATE_NUMERATOR; + dvdemux->framerate_denominator = NTSC_FRAMERATE_DENOMINATOR; + } /* let demux_video set the height, it needs to detect when things change so * it can reset caps */ |