1.1 --- a/gst-gmyth/nuvdemux/gstnuvdemux.c Thu Jun 14 18:21:08 2007 +0100
1.2 +++ b/gst-gmyth/nuvdemux/gstnuvdemux.c Fri Aug 03 21:43:42 2007 +0100
1.3 @@ -1,23 +1,20 @@
1.4 -/* GStreamer
1.5 - * Copyright (C) <2006> Renato Araujo Oliveira Filho <renato.filho@indt.org.br>
1.6 - * Rosfran Borges <rosfran.borges@indt.org.br>
1.7 - *
1.8 - * This library is free software; you can redistribute it and/or
1.9 - * modify it under the terms of the GNU Library General Public
1.10 - * License as published by the Free Software Foundation; either
1.11 - * version 2 of the License, or (at your option) any later version.
1.12 - *
1.13 - * This library is distributed in the hope that it will be useful,
1.14 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.15 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.16 - * Library General Public License for more details.
1.17 - *
1.18 - * You should have received a copy of the GNU Library General Public
1.19 - * License along with this library; if not, write to the
1.20 - * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
1.21 - * Boston, MA 02111-1307, USA.
1.22 +/*
1.23 + * GStreamer Copyright (C) <2006> Renato Araujo Oliveira Filho
1.24 + * <renato.filho@indt.org.br> Rosfran Borges <rosfran.borges@indt.org.br>
1.25 + * This library is free software; you can redistribute it and/or modify it
1.26 + * under the terms of the GNU Library General Public License as published
1.27 + * by the Free Software Foundation; either version 2 of the License, or (at
1.28 + * your option) any later version. This library is distributed in the hope
1.29 + * that it will be useful, but WITHOUT ANY WARRANTY; without even the
1.30 + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1.31 + * See the GNU Library General Public License for more details. You should
1.32 + * have received a copy of the GNU Library General Public License along
1.33 + * with this library; if not, write to the Free Software Foundation, Inc.,
1.34 + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1.35 */
1.36 -/* Element-Checklist-Version: 5 */
1.37 +/*
1.38 + * Element-Checklist-Version: 5
1.39 + */
1.40
1.41 /**
1.42 * SECTION:element-nuvdemux
1.43 @@ -63,237 +60,251 @@
1.44 #define GST_FLOW_ERROR_NO_DATA -101
1.45 #define GST_FLOW_ERROR_EOS -102
1.46
1.47 -enum
1.48 -{
1.49 - NUV_PUSH_MODE = 0,
1.50 - NUV_PULL_MODE
1.51 +enum {
1.52 + NUV_PUSH_MODE = 0,
1.53 + NUV_PULL_MODE
1.54 };
1.55
1.56 GST_DEBUG_CATEGORY_EXTERN(GST_CAT_EVENT);
1.57
1.58 static const GstElementDetails gst_nuv_demux_details =
1.59 GST_ELEMENT_DETAILS("Nuv demuxer",
1.60 - "Codec/Demuxer",
1.61 - "Demultiplex a .nuv file into audio and video",
1.62 - "Renato Araujo Oliveira Filho <renato.filho@indt.org.br>,"
1.63 - "Rosfran Borges <rosfran.borges@indt.org.br>");
1.64 + "Codec/Demuxer",
1.65 + "Demultiplex a .nuv file into audio and video",
1.66 + "Renato Araujo Oliveira Filho <renato.filho@indt.org.br>,"
1.67 + "Rosfran Borges <rosfran.borges@indt.org.br>");
1.68
1.69
1.70 -/* file header */
1.71 -typedef struct
1.72 -{
1.73 - gchar id[12]; /* "NuppelVideo\0" or "MythTVVideo\0" */
1.74 - gchar version[5]; /* "x.xx\0" */
1.75 +/*
1.76 + * file header
1.77 + */
1.78 +typedef struct {
1.79 + gchar id[12]; /* "NuppelVideo\0" or "MythTVVideo\0" */
1.80 + gchar version[5]; /* "x.xx\0" */
1.81
1.82 - gint i_width;
1.83 - gint i_height;
1.84 - gint i_width_desired;
1.85 - gint i_height_desired;
1.86 + gint i_width;
1.87 + gint i_height;
1.88 + gint i_width_desired;
1.89 + gint i_height_desired;
1.90
1.91 - gchar i_mode; /* P progressive, I interlaced */
1.92 + gchar i_mode; /* P progressive, I interlaced */
1.93
1.94 - gdouble d_aspect; /* 1.0 squared pixel */
1.95 - gdouble d_fps;
1.96 - //fps num/denom
1.97 - gint i_fpsn;
1.98 - gint i_fpsd;
1.99 + gdouble d_aspect; /* 1.0 squared pixel */
1.100 + gdouble d_fps;
1.101 + // fps num/denom
1.102 + gint i_fpsn;
1.103 + gint i_fpsd;
1.104
1.105 - gint i_video_blocks; /* 0 no video, -1 unknown */
1.106 - gint i_audio_blocks;
1.107 - gint i_text_blocks;
1.108 + gint i_video_blocks; /* 0 no video, -1 unknown */
1.109 + gint i_audio_blocks;
1.110 + gint i_text_blocks;
1.111
1.112 - gint i_keyframe_distance;
1.113 + gint i_keyframe_distance;
1.114
1.115 } nuv_header;
1.116
1.117 -/* frame header */
1.118 -typedef struct
1.119 -{
1.120 - gchar i_type; /* A: audio, V: video, S: sync; T: test
1.121 - R: Seekpoint (string:RTjjjjjjjj)
1.122 - D: Extra data for codec */
1.123 - gchar i_compression; /* V: 0 uncompressed
1.124 - 1 RTJpeg
1.125 - 2 RTJpeg+lzo
1.126 - N black frame
1.127 - L copy last
1.128 - A: 0 uncompressed (44100 1-bits, 2ch)
1.129 - 1 lzo
1.130 - 2 layer 2
1.131 - 3 layer 3
1.132 - F flac
1.133 - S shorten
1.134 - N null frame loudless
1.135 - L copy last
1.136 - S: B audio and vdeo sync point
1.137 - A audio sync info (timecode == effective
1.138 - dsp frequency*100)
1.139 - V next video sync (timecode == next video
1.140 - frame num)
1.141 - S audio,video,text correlation */
1.142 - gchar i_keyframe; /* 0 keyframe, else no no key frame */
1.143 - guint8 i_filters; /* 0x01: gauss 5 pixel (8,2,2,2,2)/16
1.144 - 0x02: gauss 5 pixel (8,1,1,1,1)/12
1.145 - 0x04: cartoon filter */
1.146 +/*
1.147 + * frame header
1.148 + */
1.149 +typedef struct {
1.150 + gchar i_type; /* A: audio, V: video, S: sync; T: test R:
1.151 + * Seekpoint (string:RTjjjjjjjj) D: Extra
1.152 + * data for codec */
1.153 + gchar i_compression; /* V: 0 uncompressed 1 RTJpeg 2
1.154 + * RTJpeg+lzo N black frame L copy
1.155 + * last A: 0 uncompressed (44100
1.156 + * 1-bits, 2ch) 1 lzo 2 layer 2 3
1.157 + * layer 3 F flac S shorten N null
1.158 + * frame loudless L copy last S: B
1.159 + * audio and vdeo sync point A audio
1.160 + * sync info (timecode == effective
1.161 + * dsp frequency*100) V next video
1.162 + * sync (timecode == next video frame
1.163 + * num) S audio,video,text correlation
1.164 + */
1.165 + gchar i_keyframe; /* 0 keyframe, else no no key frame */
1.166 + guint8 i_filters; /* 0x01: gauss 5 pixel (8,2,2,2,2)/16
1.167 + * 0x02: gauss 5 pixel (8,1,1,1,1)/12
1.168 + * 0x04: cartoon filter */
1.169
1.170 - gint32 i_timecode; /* ms */
1.171 + gint32 i_timecode; /* ms */
1.172
1.173 - gint i_length; /* V,A,T: length of following data
1.174 - S: length of packet correl */
1.175 + gint i_length; /* V,A,T: length of following data S:
1.176 + * length of packet correl */
1.177 } nuv_frame_header;
1.178
1.179
1.180 -/* FIXME Not sure of this one */
1.181 -typedef struct
1.182 -{
1.183 - gint i_version;
1.184 - guint32 i_video_fcc;
1.185 +/*
1.186 + * FIXME Not sure of this one
1.187 + */
1.188 +typedef struct {
1.189 + gint i_version;
1.190 + guint32 i_video_fcc;
1.191
1.192 - guint32 i_audio_fcc;
1.193 - gint i_audio_sample_rate;
1.194 - gint i_audio_bits_per_sample;
1.195 - gint i_audio_channels;
1.196 - gint i_audio_compression_ratio;
1.197 - gint i_audio_quality;
1.198 - gint i_rtjpeg_quality;
1.199 - gint i_rtjpeg_luma_filter;
1.200 - gint i_rtjpeg_chroma_filter;
1.201 - gint i_lavc_bitrate;
1.202 - gint i_lavc_qmin;
1.203 - gint i_lavc_qmax;
1.204 - gint i_lavc_maxqdiff;
1.205 - gint64 i_seekable_offset;
1.206 - gint64 i_keyframe_adjust_offset;
1.207 + guint32 i_audio_fcc;
1.208 + gint i_audio_sample_rate;
1.209 + gint i_audio_bits_per_sample;
1.210 + gint i_audio_channels;
1.211 + gint i_audio_compression_ratio;
1.212 + gint i_audio_quality;
1.213 + gint i_rtjpeg_quality;
1.214 + gint i_rtjpeg_luma_filter;
1.215 + gint i_rtjpeg_chroma_filter;
1.216 + gint i_lavc_bitrate;
1.217 + gint i_lavc_qmin;
1.218 + gint i_lavc_qmax;
1.219 + gint i_lavc_maxqdiff;
1.220 + gint64 i_seekable_offset;
1.221 + gint64 i_keyframe_adjust_offset;
1.222
1.223 } nuv_extended_header;
1.224
1.225 -typedef struct
1.226 -{
1.227 - gint64 timecode;
1.228 - gint64 offset;
1.229 +typedef struct {
1.230 + gint64 timecode;
1.231 + gint64 offset;
1.232
1.233 } frame_index_data;
1.234
1.235 -typedef enum
1.236 -{
1.237 - GST_NUV_DEMUX_START,
1.238 - GST_NUV_DEMUX_HEADER_DATA,
1.239 - GST_NUV_DEMUX_EXTRA_DATA,
1.240 - GST_NUV_DEMUX_MPEG_DATA,
1.241 - GST_NUV_DEMUX_EXTEND_HEADER,
1.242 - GST_NUV_DEMUX_EXTEND_HEADER_DATA,
1.243 - GST_NUV_DEMUX_INDEX_CREATE,
1.244 - GST_NUV_DEMUX_FRAME_HEADER,
1.245 - GST_NUV_DEMUX_MOVI,
1.246 - GST_NUV_DEMUX_INVALID_DATA
1.247 +typedef enum {
1.248 + GST_NUV_DEMUX_START,
1.249 + GST_NUV_DEMUX_HEADER_DATA,
1.250 + GST_NUV_DEMUX_EXTRA_DATA,
1.251 + GST_NUV_DEMUX_MPEG_DATA,
1.252 + GST_NUV_DEMUX_EXTEND_HEADER,
1.253 + GST_NUV_DEMUX_EXTEND_HEADER_DATA,
1.254 + GST_NUV_DEMUX_INDEX_CREATE,
1.255 + GST_NUV_DEMUX_FRAME_HEADER,
1.256 + GST_NUV_DEMUX_MOVI,
1.257 + GST_NUV_DEMUX_INVALID_DATA
1.258 } GstNuvDemuxState;
1.259
1.260 -struct _GstNuvDemuxPrivate
1.261 -{
1.262 - /* used for indicate the mode */
1.263 - guint mode;
1.264 +struct _GstNuvDemuxPrivate {
1.265 + /*
1.266 + * used for indicate the mode
1.267 + */
1.268 + guint mode;
1.269
1.270 - /* used on push mode */
1.271 - GstAdapter *adapter;
1.272 + /*
1.273 + * used on push mode
1.274 + */
1.275 + GstAdapter *adapter;
1.276
1.277 - /* pads */
1.278 - GstPad *sinkpad;
1.279 - GstPad *src_video_pad;
1.280 - GstPad *src_audio_pad;
1.281 + /*
1.282 + * pads
1.283 + */
1.284 + GstPad *sinkpad;
1.285 + GstPad *src_video_pad;
1.286 + GstPad *src_audio_pad;
1.287
1.288 - /* Flow control */
1.289 - GstFlowReturn last_video_return;
1.290 - GstFlowReturn last_audio_return;
1.291 - gboolean more_data;
1.292 - gboolean eos;
1.293 - gboolean new_file;
1.294 - guint segment;
1.295 + /*
1.296 + * Flow control
1.297 + */
1.298 + GstFlowReturn last_video_return;
1.299 + GstFlowReturn last_audio_return;
1.300 + gboolean more_data;
1.301 + gboolean eos;
1.302 + gboolean new_file;
1.303 + guint segment;
1.304
1.305 - /* NUV decoding state */
1.306 - GstNuvDemuxState state;
1.307 - guint64 offset;
1.308 + /*
1.309 + * NUV decoding state
1.310 + */
1.311 + GstNuvDemuxState state;
1.312 + guint64 offset;
1.313
1.314 - /* duration information */
1.315 - guint64 duration_bytes;
1.316 - guint64 duration_time;
1.317 - guint64 segment_stop;
1.318 - guint64 segment_start;
1.319 + /*
1.320 + * duration information
1.321 + */
1.322 + guint64 duration_bytes;
1.323 + guint64 duration_time;
1.324 + guint64 segment_stop;
1.325 + guint64 segment_start;
1.326
1.327 - /* segment control info */
1.328 - gboolean new_audio_segment;
1.329 - gboolean new_video_segment;
1.330 + /*
1.331 + * segment control info
1.332 + */
1.333 + gboolean new_audio_segment;
1.334 + gboolean new_video_segment;
1.335
1.336 - /* Mpeg ExtraData */
1.337 - guint64 mpeg_data_size;
1.338 - GstBuffer *mpeg_buffer;
1.339 + /*
1.340 + * Mpeg ExtraData
1.341 + */
1.342 + guint64 mpeg_data_size;
1.343 + GstBuffer *mpeg_buffer;
1.344
1.345 - /* Headers */
1.346 - nuv_header h;
1.347 - nuv_extended_header eh;
1.348 - nuv_frame_header fh;
1.349 + /*
1.350 + * Headers
1.351 + */
1.352 + nuv_header h;
1.353 + nuv_extended_header eh;
1.354 + nuv_frame_header fh;
1.355
1.356 - /* anothers info */
1.357 - guint64 header_lengh;
1.358 - gint64 time_start;
1.359 - gint64 time_diff;
1.360 - gint64 time_qos;
1.361 - guint64 last_frame_time;
1.362 - GSList *index;
1.363 + /*
1.364 + * anothers info
1.365 + */
1.366 + guint64 header_lengh;
1.367 + gint64 time_start;
1.368 + gint64 time_diff;
1.369 + gint64 time_qos;
1.370 + guint64 last_frame_time;
1.371 + GSList *index;
1.372 };
1.373
1.374
1.375 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE("sink",
1.376 - GST_PAD_SINK,
1.377 - GST_PAD_ALWAYS,
1.378 - GST_STATIC_CAPS
1.379 - ("video/x-nuv"));
1.380 + GST_PAD_SINK,
1.381 + GST_PAD_ALWAYS,
1.382 + GST_STATIC_CAPS
1.383 + ("video/x-nuv"));
1.384
1.385 static GstStaticPadTemplate audio_src_template =
1.386 GST_STATIC_PAD_TEMPLATE("audio_src",
1.387 - GST_PAD_SRC,
1.388 - GST_PAD_SOMETIMES,
1.389 - GST_STATIC_CAPS_ANY);
1.390 + GST_PAD_SRC,
1.391 + GST_PAD_SOMETIMES,
1.392 + GST_STATIC_CAPS_ANY);
1.393
1.394 static GstStaticPadTemplate video_src_template =
1.395 GST_STATIC_PAD_TEMPLATE("video_src",
1.396 - GST_PAD_SRC,
1.397 - GST_PAD_SOMETIMES,
1.398 - GST_STATIC_CAPS_ANY);
1.399 + GST_PAD_SRC,
1.400 + GST_PAD_SOMETIMES,
1.401 + GST_STATIC_CAPS_ANY);
1.402
1.403 -static void gst_nuv_demux_dispose(GObject * object);
1.404 -static void gst_nuv_demux_finalize(GObject * object);
1.405 -static GstStateChangeReturn gst_nuv_demux_change_state(GstElement * element,
1.406 - GstStateChange
1.407 - transition);
1.408 -static void gst_nuv_demux_loop(GstPad * pad);
1.409 +static void gst_nuv_demux_dispose(GObject * object);
1.410 +static void gst_nuv_demux_finalize(GObject * object);
1.411 +static GstStateChangeReturn gst_nuv_demux_change_state(GstElement *
1.412 + element,
1.413 + GstStateChange
1.414 + transition);
1.415 +static void gst_nuv_demux_loop(GstPad * pad);
1.416 static GstFlowReturn gst_nuv_demux_chain(GstPad * pad, GstBuffer * buf);
1.417 static GstFlowReturn gst_nuv_demux_play(GstPad * pad);
1.418 static gboolean gst_nuv_demux_sink_activate_pull(GstPad * sinkpad,
1.419 - gboolean active);
1.420 + gboolean active);
1.421 static gboolean gst_nuv_demux_sink_activate_push(GstPad * pad,
1.422 - gboolean active);
1.423 + gboolean active);
1.424 static gboolean gst_nuv_demux_sink_activate(GstPad * sinkpad);
1.425 static gboolean gst_nuv_demux_sink_event(GstPad * pad, GstEvent * event);
1.426 static gboolean gst_nuv_demux_srcpad_event(GstPad * pad, GstEvent * event);
1.427 static frame_index_data *gst_nuv_demux_do_seek_index(GstNuvDemux * nuv,
1.428 - gint64 seek_pos,
1.429 - gint64 segment_stop,
1.430 - GstFormat format);
1.431 + gint64 seek_pos,
1.432 + gint64 segment_stop,
1.433 + GstFormat format);
1.434
1.435
1.436 static GstFlowReturn gst_nuv_demux_move_bytes(GstNuvDemux * nuv,
1.437 - guint64 size);
1.438 -static GstFlowReturn gst_nuv_demux_read_bytes(GstNuvDemux * nuv, guint64 size,
1.439 - gboolean move,
1.440 - GstBuffer ** buffer);
1.441 -static void gst_nuv_demux_reset(GstNuvDemux * nuv);
1.442 -static void gst_nuv_demux_destoy_src_pad(GstNuvDemux * nuv);
1.443 -static void gst_nuv_demux_send_eos(GstNuvDemux * nuv);
1.444 -static void gst_nuv_demux_create_seek_index(GstNuvDemux * nuv);
1.445 + guint64 size);
1.446 +static GstFlowReturn gst_nuv_demux_read_bytes(GstNuvDemux * nuv,
1.447 + guint64 size, gboolean move,
1.448 + GstBuffer ** buffer);
1.449 +static void gst_nuv_demux_reset(GstNuvDemux * nuv);
1.450 +static void gst_nuv_demux_destoy_src_pad(GstNuvDemux * nuv);
1.451 +static void gst_nuv_demux_send_eos(GstNuvDemux * nuv);
1.452 +static void gst_nuv_demux_create_seek_index(GstNuvDemux * nuv);
1.453
1.454
1.455 #if (GST_VERSION_MINOR == 10) && (GST_VERSION_MICRO < 6)
1.456 -GstBuffer *gst_adapter_take_buffer(GstAdapter * adapter, guint nbytes);
1.457 +GstBuffer *gst_adapter_take_buffer(GstAdapter * adapter,
1.458 + guint nbytes);
1.459 #endif
1.460
1.461
1.462 @@ -303,1730 +314,1605 @@
1.463 * Utils function
1.464 ******************************************************************************/
1.465 #if G_BYTE_ORDER == G_BIG_ENDIAN
1.466 -static inline gdouble
1.467 +static inline gdouble
1.468 _gdouble_swap_le_be(gdouble * d)
1.469 {
1.470 - union
1.471 - {
1.472 - guint64 i;
1.473 - gdouble d;
1.474 - } u;
1.475 + union {
1.476 + guint64 i;
1.477 + gdouble d;
1.478 + } u;
1.479
1.480 - u.d = *d;
1.481 - u.i = GUINT64_SWAP_LE_BE(u.i);
1.482 - return u.d;
1.483 + u.d = *d;
1.484 + u.i = GUINT64_SWAP_LE_BE(u.i);
1.485 + return u.d;
1.486 }
1.487
1.488 #define READ_DOUBLE_FROM_LE(d) (_gdouble_swap_le_be((gdouble* ) d))
1.489 -#else /* G_BYTE_ORDER != G_BIG_ENDIAN */
1.490 +#else /* G_BYTE_ORDER != G_BIG_ENDIAN */
1.491 #define READ_DOUBLE_FROM_LE(d) *((gdouble* ) (d))
1.492 -#endif /* G_BYTE_ORDER != G_BIG_ENDIAN */
1.493 +#endif /* G_BYTE_ORDER != G_BIG_ENDIAN */
1.494
1.495 static void
1.496 double2fraction(double in, int *num, int *denom)
1.497 {
1.498 - if (in == 29.97)
1.499 - {
1.500 - *num = 30000;
1.501 - *denom = 1001;
1.502 - }
1.503 - else if (in == 23.976)
1.504 - {
1.505 - *num = 24000;
1.506 - *denom = 1001;
1.507 - }
1.508 - else
1.509 - {
1.510 - *denom = 1;
1.511 - while (in - floor(in) >= 0.1)
1.512 - {
1.513 - *denom *= 10;
1.514 - in *= 10.0;
1.515 - }
1.516 - *num = (int) floor(in);
1.517 - }
1.518 + if (in == 29.97) {
1.519 + *num = 30000;
1.520 + *denom = 1001;
1.521 + } else if (in == 23.976) {
1.522 + *num = 24000;
1.523 + *denom = 1001;
1.524 + } else {
1.525 + *denom = 1;
1.526 + while (in - floor(in) >= 0.1) {
1.527 + *denom *= 10;
1.528 + in *= 10.0;
1.529 + }
1.530 + *num = (int) floor(in);
1.531 + }
1.532 }
1.533
1.534 -/* GObject Functions */
1.535 +/*
1.536 + * GObject Functions
1.537 + */
1.538
1.539 static void
1.540 gst_nuv_demux_base_init(gpointer klass)
1.541 {
1.542 - GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
1.543 + GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
1.544
1.545 - gst_element_class_add_pad_template(element_class,
1.546 - gst_static_pad_template_get
1.547 - (&audio_src_template));
1.548 + gst_element_class_add_pad_template(element_class,
1.549 + gst_static_pad_template_get
1.550 + (&audio_src_template));
1.551
1.552 - gst_element_class_add_pad_template(element_class,
1.553 - gst_static_pad_template_get
1.554 - (&video_src_template));
1.555 + gst_element_class_add_pad_template(element_class,
1.556 + gst_static_pad_template_get
1.557 + (&video_src_template));
1.558
1.559 - gst_element_class_add_pad_template(element_class,
1.560 - gst_static_pad_template_get
1.561 - (&sink_template));
1.562 - gst_element_class_set_details(element_class, &gst_nuv_demux_details);
1.563 + gst_element_class_add_pad_template(element_class,
1.564 + gst_static_pad_template_get
1.565 + (&sink_template));
1.566 + gst_element_class_set_details(element_class, &gst_nuv_demux_details);
1.567 }
1.568
1.569 static void
1.570 gst_nuv_demux_class_init(GstNuvDemuxClass * klass)
1.571 {
1.572 - GstElementClass *gstelement_class = GST_ELEMENT_CLASS(klass);
1.573 - GObjectClass *gobject_class = (GObjectClass *) klass;
1.574 + GstElementClass *gstelement_class = GST_ELEMENT_CLASS(klass);
1.575 + GObjectClass *gobject_class = (GObjectClass *) klass;
1.576
1.577 - GST_DEBUG_CATEGORY_INIT(nuvdemux_debug, "nuvdemux",
1.578 - 0, "Demuxer for NUV streams");
1.579 + GST_DEBUG_CATEGORY_INIT(nuvdemux_debug, "nuvdemux",
1.580 + 0, "Demuxer for NUV streams");
1.581
1.582 - parent_class = g_type_class_peek_parent(klass);
1.583 + parent_class = g_type_class_peek_parent(klass);
1.584
1.585 - gobject_class->dispose = gst_nuv_demux_dispose;
1.586 - gobject_class->finalize = gst_nuv_demux_finalize;
1.587 - gstelement_class->change_state = gst_nuv_demux_change_state;
1.588 + gobject_class->dispose = gst_nuv_demux_dispose;
1.589 + gobject_class->finalize = gst_nuv_demux_finalize;
1.590 + gstelement_class->change_state = gst_nuv_demux_change_state;
1.591
1.592 - g_type_class_add_private(gobject_class, sizeof(GstNuvDemuxPrivate));
1.593 + g_type_class_add_private(gobject_class, sizeof(GstNuvDemuxPrivate));
1.594 }
1.595
1.596 static void
1.597 gst_nuv_demux_init(GstNuvDemux * nuv, GstNuvDemuxClass * nuv_class)
1.598 {
1.599 - nuv->priv = GST_NUV_DEMUX_GET_PRIVATE(nuv);
1.600 - nuv->priv->sinkpad =
1.601 - gst_pad_new_from_static_template(&sink_template, "sink");
1.602 + nuv->priv = GST_NUV_DEMUX_GET_PRIVATE(nuv);
1.603 + nuv->priv->sinkpad =
1.604 + gst_pad_new_from_static_template(&sink_template, "sink");
1.605
1.606 - /* creating adapter */
1.607 - nuv->priv->mode = NUV_PUSH_MODE;
1.608 - nuv->priv->adapter = gst_adapter_new();
1.609 + /*
1.610 + * creating adapter
1.611 + */
1.612 + nuv->priv->mode = NUV_PUSH_MODE;
1.613 + nuv->priv->adapter = gst_adapter_new();
1.614
1.615 - nuv->priv->new_audio_segment = TRUE;
1.616 - nuv->priv->new_video_segment = TRUE;
1.617 + nuv->priv->new_audio_segment = TRUE;
1.618 + nuv->priv->new_video_segment = TRUE;
1.619
1.620 - gst_pad_set_activate_function(nuv->priv->sinkpad,
1.621 - gst_nuv_demux_sink_activate);
1.622 - gst_pad_set_activatepull_function(nuv->priv->sinkpad,
1.623 - gst_nuv_demux_sink_activate_pull);
1.624 - gst_pad_set_activatepush_function(nuv->priv->sinkpad,
1.625 - gst_nuv_demux_sink_activate_push);
1.626 - gst_pad_set_chain_function(nuv->priv->sinkpad,
1.627 - GST_DEBUG_FUNCPTR(gst_nuv_demux_chain));
1.628 - gst_pad_set_event_function(nuv->priv->sinkpad,
1.629 - GST_DEBUG_FUNCPTR(gst_nuv_demux_sink_event));
1.630 + gst_pad_set_activate_function(nuv->priv->sinkpad,
1.631 + gst_nuv_demux_sink_activate);
1.632 + gst_pad_set_activatepull_function(nuv->priv->sinkpad,
1.633 + gst_nuv_demux_sink_activate_pull);
1.634 + gst_pad_set_activatepush_function(nuv->priv->sinkpad,
1.635 + gst_nuv_demux_sink_activate_push);
1.636 + gst_pad_set_chain_function(nuv->priv->sinkpad,
1.637 + GST_DEBUG_FUNCPTR(gst_nuv_demux_chain));
1.638 + gst_pad_set_event_function(nuv->priv->sinkpad,
1.639 + GST_DEBUG_FUNCPTR
1.640 + (gst_nuv_demux_sink_event));
1.641
1.642
1.643 - gst_element_add_pad(GST_ELEMENT(nuv), nuv->priv->sinkpad);
1.644 + gst_element_add_pad(GST_ELEMENT(nuv), nuv->priv->sinkpad);
1.645
1.646 }
1.647
1.648 static void
1.649 gst_nuv_demux_dispose(GObject * object)
1.650 {
1.651 - GstNuvDemux *nuv = GST_NUV_DEMUX(object);
1.652 + GstNuvDemux *nuv = GST_NUV_DEMUX(object);
1.653
1.654
1.655 - if (nuv->priv->mpeg_buffer != NULL)
1.656 - {
1.657 - gst_buffer_unref(nuv->priv->mpeg_buffer);
1.658 - }
1.659 + if (nuv->priv->mpeg_buffer != NULL) {
1.660 + gst_buffer_unref(nuv->priv->mpeg_buffer);
1.661 + }
1.662
1.663 - gst_nuv_demux_reset(GST_NUV_DEMUX(object));
1.664 - gst_nuv_demux_destoy_src_pad(GST_NUV_DEMUX(object));
1.665 + gst_nuv_demux_reset(GST_NUV_DEMUX(object));
1.666 + gst_nuv_demux_destoy_src_pad(GST_NUV_DEMUX(object));
1.667
1.668 - if (nuv->priv->adapter != NULL)
1.669 - {
1.670 - gst_object_unref(nuv->priv->adapter);
1.671 - }
1.672 + if (nuv->priv->adapter != NULL) {
1.673 + gst_object_unref(nuv->priv->adapter);
1.674 + }
1.675 }
1.676
1.677 static void
1.678 gst_nuv_demux_finalize(GObject * object)
1.679 {
1.680 - G_OBJECT_CLASS(parent_class)->finalize(object);
1.681 + G_OBJECT_CLASS(parent_class)->finalize(object);
1.682 }
1.683
1.684
1.685 -/* HeaderLoad:
1.686 +/*
1.687 + * HeaderLoad:
1.688 */
1.689 -static GstFlowReturn
1.690 +static GstFlowReturn
1.691 gst_nuv_demux_header_load(GstNuvDemux * nuv, nuv_header * h)
1.692 {
1.693 - GstBuffer *buffer = NULL;
1.694 - GstFlowReturn res = gst_nuv_demux_read_bytes(nuv, 72, TRUE, &buffer);
1.695 + GstBuffer *buffer = NULL;
1.696 + GstFlowReturn res = gst_nuv_demux_read_bytes(nuv, 72, TRUE, &buffer);
1.697
1.698 - if ((res != GST_FLOW_OK) || (buffer == NULL))
1.699 - {
1.700 - goto done;
1.701 - }
1.702 + if ((res != GST_FLOW_OK) || (buffer == NULL)) {
1.703 + goto done;
1.704 + }
1.705
1.706 - if (h != NULL)
1.707 - {
1.708 - memcpy(h->id, buffer->data, 12);
1.709 - memcpy(h->version, buffer->data + 12, 5);
1.710 - h->i_width = GST_READ_UINT32_LE(&buffer->data[20]);
1.711 - h->i_height = GST_READ_UINT32_LE(&buffer->data[24]);
1.712 - h->i_width_desired = GST_READ_UINT32_LE(&buffer->data[28]);
1.713 - h->i_height_desired = GST_READ_UINT32_LE(&buffer->data[32]);
1.714 - h->i_mode = GPOINTER_TO_INT(buffer->data[36]);
1.715 - h->d_aspect = READ_DOUBLE_FROM_LE(&buffer->data[40]);
1.716 - h->d_fps = READ_DOUBLE_FROM_LE(&buffer->data[48]);
1.717 - /* get the num and denom values from fps */
1.718 - double2fraction(h->d_fps, &h->i_fpsn, &h->i_fpsd);
1.719 - h->i_video_blocks = GST_READ_UINT32_LE(&buffer->data[56]);
1.720 - h->i_audio_blocks = GST_READ_UINT32_LE(&buffer->data[60]);
1.721 - h->i_text_blocks = GST_READ_UINT32_LE(&buffer->data[64]);
1.722 - h->i_keyframe_distance = GST_READ_UINT32_LE(&buffer->data[68]);
1.723 + if (h != NULL) {
1.724 + memcpy(h->id, buffer->data, 12);
1.725 + memcpy(h->version, buffer->data + 12, 5);
1.726 + h->i_width = GST_READ_UINT32_LE(&buffer->data[20]);
1.727 + h->i_height = GST_READ_UINT32_LE(&buffer->data[24]);
1.728 + h->i_width_desired = GST_READ_UINT32_LE(&buffer->data[28]);
1.729 + h->i_height_desired = GST_READ_UINT32_LE(&buffer->data[32]);
1.730 + h->i_mode = GPOINTER_TO_INT(buffer->data[36]);
1.731 + h->d_aspect = READ_DOUBLE_FROM_LE(&buffer->data[40]);
1.732 + h->d_fps = READ_DOUBLE_FROM_LE(&buffer->data[48]);
1.733 + /*
1.734 + * get the num and denom values from fps
1.735 + */
1.736 + double2fraction(h->d_fps, &h->i_fpsn, &h->i_fpsd);
1.737 + h->i_video_blocks = GST_READ_UINT32_LE(&buffer->data[56]);
1.738 + h->i_audio_blocks = GST_READ_UINT32_LE(&buffer->data[60]);
1.739 + h->i_text_blocks = GST_READ_UINT32_LE(&buffer->data[64]);
1.740 + h->i_keyframe_distance = GST_READ_UINT32_LE(&buffer->data[68]);
1.741
1.742 - GST_DEBUG_OBJECT(nuv,
1.743 - "nuv: h=%s v=%s %dx%d a=%f fps=%f v=%d a=%d t=%d kfd=%d",
1.744 - h->id, h->version, h->i_width, h->i_height,
1.745 - h->d_aspect, h->d_fps, h->i_video_blocks,
1.746 - h->i_audio_blocks, h->i_text_blocks,
1.747 - h->i_keyframe_distance);
1.748 - }
1.749 + GST_DEBUG_OBJECT(nuv,
1.750 + "nuv: h=%s v=%s %dx%d a=%f fps=%f v=%d a=%d t=%d kfd=%d",
1.751 + h->id, h->version, h->i_width, h->i_height,
1.752 + h->d_aspect, h->d_fps, h->i_video_blocks,
1.753 + h->i_audio_blocks, h->i_text_blocks,
1.754 + h->i_keyframe_distance);
1.755 + }
1.756
1.757 -done:
1.758 - if (buffer != NULL)
1.759 - {
1.760 - gst_buffer_unref(buffer);
1.761 - buffer = NULL;
1.762 - }
1.763 - return res;
1.764 + done:
1.765 + if (buffer != NULL) {
1.766 + gst_buffer_unref(buffer);
1.767 + buffer = NULL;
1.768 + }
1.769 + return res;
1.770 }
1.771
1.772 -static GstFlowReturn
1.773 +static GstFlowReturn
1.774 gst_nuv_demux_stream_header_data(GstNuvDemux * nuv)
1.775 {
1.776 - GstFlowReturn res;
1.777 + GstFlowReturn res;
1.778
1.779 - if (nuv->priv->new_file)
1.780 - res = gst_nuv_demux_header_load(nuv, NULL);
1.781 - else
1.782 - res = gst_nuv_demux_header_load(nuv, &nuv->priv->h);
1.783 + if (nuv->priv->new_file)
1.784 + res = gst_nuv_demux_header_load(nuv, NULL);
1.785 + else
1.786 + res = gst_nuv_demux_header_load(nuv, &nuv->priv->h);
1.787
1.788 - if (res == GST_FLOW_OK)
1.789 - nuv->priv->state = GST_NUV_DEMUX_EXTRA_DATA;
1.790 - return res;
1.791 + if (res == GST_FLOW_OK)
1.792 + nuv->priv->state = GST_NUV_DEMUX_EXTRA_DATA;
1.793 + return res;
1.794 }
1.795
1.796 /*
1.797 * Read NUV file tag
1.798 */
1.799 -static GstFlowReturn
1.800 +static GstFlowReturn
1.801 gst_nuv_demux_stream_file_header(GstNuvDemux * nuv)
1.802 {
1.803 - GstFlowReturn res = GST_FLOW_OK;
1.804 - GstBuffer *file_header = NULL;
1.805 + GstFlowReturn res = GST_FLOW_OK;
1.806 + GstBuffer *file_header = NULL;
1.807
1.808 - res = gst_nuv_demux_read_bytes(nuv, 12, FALSE, &file_header);
1.809 - if (res == GST_FLOW_OK)
1.810 - {
1.811 - if (strncmp((gchar *) file_header->data, "MythTVVideo", 11) ||
1.812 - strncmp((gchar *) file_header->data, "NuppelVideo", 11))
1.813 - {
1.814 - nuv->priv->state = GST_NUV_DEMUX_HEADER_DATA;
1.815 - }
1.816 - else
1.817 - {
1.818 - GST_DEBUG_OBJECT(nuv, "error parsing file header");
1.819 - nuv->priv->state = GST_NUV_DEMUX_INVALID_DATA;
1.820 - res = GST_FLOW_ERROR;
1.821 - }
1.822 - }
1.823 + res = gst_nuv_demux_read_bytes(nuv, 12, FALSE, &file_header);
1.824 + if (res == GST_FLOW_OK) {
1.825 + if (strncmp((gchar *) file_header->data, "MythTVVideo", 11) ||
1.826 + strncmp((gchar *) file_header->data, "NuppelVideo", 11)) {
1.827 + nuv->priv->state = GST_NUV_DEMUX_HEADER_DATA;
1.828 + } else {
1.829 + GST_DEBUG_OBJECT(nuv, "error parsing file header");
1.830 + nuv->priv->state = GST_NUV_DEMUX_INVALID_DATA;
1.831 + res = GST_FLOW_ERROR;
1.832 + }
1.833 + }
1.834
1.835 - if (file_header != NULL)
1.836 - {
1.837 - gst_buffer_unref(file_header);
1.838 - file_header = NULL;
1.839 - }
1.840 - return res;
1.841 + if (file_header != NULL) {
1.842 + gst_buffer_unref(file_header);
1.843 + file_header = NULL;
1.844 + }
1.845 + return res;
1.846 }
1.847
1.848 -/* FrameHeaderLoad:
1.849 +/*
1.850 + * FrameHeaderLoad:
1.851 */
1.852 -static GstFlowReturn
1.853 +static GstFlowReturn
1.854 gst_nuv_demux_frame_header_load(GstNuvDemux * nuv, nuv_frame_header * h)
1.855 {
1.856 - unsigned char *data;
1.857 - GstBuffer *buf = NULL;
1.858 + unsigned char *data;
1.859 + GstBuffer *buf = NULL;
1.860
1.861 - GstFlowReturn res = gst_nuv_demux_read_bytes(nuv, 12, TRUE, &buf);
1.862 + GstFlowReturn res = gst_nuv_demux_read_bytes(nuv, 12, TRUE, &buf);
1.863
1.864 - if ((res != GST_FLOW_OK) || (buf == NULL))
1.865 - {
1.866 - goto done;
1.867 - }
1.868 + if ((res != GST_FLOW_OK) || (buf == NULL)) {
1.869 + goto done;
1.870 + }
1.871
1.872 - if (h == NULL)
1.873 - goto done;
1.874 + if (h == NULL)
1.875 + goto done;
1.876
1.877 - data = buf->data;
1.878 + data = buf->data;
1.879
1.880 - h->i_type = GPOINTER_TO_INT(data[0]);
1.881 - h->i_compression = GPOINTER_TO_INT(data[1]);
1.882 - h->i_keyframe = GPOINTER_TO_INT(data[2]);
1.883 - h->i_filters = GPOINTER_TO_INT(data[3]);
1.884 - h->i_timecode = GST_READ_UINT32_LE(&data[4]);
1.885 - h->i_length = GST_READ_UINT32_LE(&data[8]);
1.886 + h->i_type = GPOINTER_TO_INT(data[0]);
1.887 + h->i_compression = GPOINTER_TO_INT(data[1]);
1.888 + h->i_keyframe = GPOINTER_TO_INT(data[2]);
1.889 + h->i_filters = GPOINTER_TO_INT(data[3]);
1.890 + h->i_timecode = GST_READ_UINT32_LE(&data[4]);
1.891 + h->i_length = GST_READ_UINT32_LE(&data[8]);
1.892
1.893 - GST_DEBUG_OBJECT(nuv, "frame hdr: t=%c c=%c k=%d f=0x%x timecode=%d l=%d",
1.894 - h->i_type,
1.895 - h->i_compression ? h->i_compression : ' ',
1.896 - h->i_keyframe ? h->i_keyframe : ' ',
1.897 - h->i_filters, h->i_timecode, h->i_length);
1.898 + GST_DEBUG_OBJECT(nuv,
1.899 + "frame hdr: t=%c c=%c k=%d f=0x%x timecode=%d l=%d",
1.900 + h->i_type, h->i_compression ? h->i_compression : ' ',
1.901 + h->i_keyframe ? h->i_keyframe : ' ', h->i_filters,
1.902 + h->i_timecode, h->i_length);
1.903
1.904 -done:
1.905 - if (buf != NULL)
1.906 - {
1.907 - gst_buffer_unref(buf);
1.908 - buf = NULL;
1.909 - }
1.910 + done:
1.911 + if (buf != NULL) {
1.912 + gst_buffer_unref(buf);
1.913 + buf = NULL;
1.914 + }
1.915
1.916 - return res;
1.917 + return res;
1.918 }
1.919
1.920 -static GstFlowReturn
1.921 -gst_nuv_demux_extended_header_load(GstNuvDemux * nuv, nuv_extended_header * h)
1.922 +static GstFlowReturn
1.923 +gst_nuv_demux_extended_header_load(GstNuvDemux * nuv,
1.924 + nuv_extended_header * h)
1.925 {
1.926 - unsigned char *data;
1.927 - GstBuffer *buff = NULL;
1.928 + unsigned char *data;
1.929 + GstBuffer *buff = NULL;
1.930
1.931 - GstFlowReturn res = gst_nuv_demux_read_bytes(nuv, 512, TRUE, &buff);
1.932 + GstFlowReturn res = gst_nuv_demux_read_bytes(nuv, 512, TRUE, &buff);
1.933
1.934 - if ((res != GST_FLOW_OK) || (buff == NULL))
1.935 - {
1.936 - goto done;
1.937 - }
1.938 + if ((res != GST_FLOW_OK) || (buff == NULL)) {
1.939 + goto done;
1.940 + }
1.941
1.942 - if (h == NULL)
1.943 - goto done;
1.944 + if (h == NULL)
1.945 + goto done;
1.946
1.947 - data = buff->data;
1.948 - h->i_version = GST_READ_UINT32_LE(&data[0]);
1.949 - h->i_video_fcc = GST_MAKE_FOURCC(data[4], data[5], data[6], data[7]);
1.950 - h->i_audio_fcc = GST_MAKE_FOURCC(data[8], data[9], data[10], data[11]);
1.951 - h->i_audio_sample_rate = GST_READ_UINT32_LE(&data[12]);
1.952 - h->i_audio_bits_per_sample = GST_READ_UINT32_LE(&data[16]);
1.953 - h->i_audio_channels = GST_READ_UINT32_LE(&data[20]);
1.954 - h->i_audio_compression_ratio = GST_READ_UINT32_LE(&data[24]);
1.955 - h->i_audio_quality = GST_READ_UINT32_LE(&data[28]);
1.956 - h->i_rtjpeg_quality = GST_READ_UINT32_LE(&data[32]);
1.957 - h->i_rtjpeg_luma_filter = GST_READ_UINT32_LE(&data[36]);
1.958 - h->i_rtjpeg_chroma_filter = GST_READ_UINT32_LE(&data[40]);
1.959 - h->i_lavc_bitrate = GST_READ_UINT32_LE(&data[44]);
1.960 - h->i_lavc_qmin = GST_READ_UINT32_LE(&data[48]);
1.961 - h->i_lavc_qmin = GST_READ_UINT32_LE(&data[52]);
1.962 - h->i_lavc_maxqdiff = GST_READ_UINT32_LE(&data[56]);
1.963 - h->i_seekable_offset = GST_READ_UINT64_LE(&data[60]);
1.964 - h->i_keyframe_adjust_offset = GST_READ_UINT64_LE(&data[68]);
1.965 + data = buff->data;
1.966 + h->i_version = GST_READ_UINT32_LE(&data[0]);
1.967 + h->i_video_fcc = GST_MAKE_FOURCC(data[4], data[5], data[6], data[7]);
1.968 + h->i_audio_fcc = GST_MAKE_FOURCC(data[8], data[9], data[10], data[11]);
1.969 + h->i_audio_sample_rate = GST_READ_UINT32_LE(&data[12]);
1.970 + h->i_audio_bits_per_sample = GST_READ_UINT32_LE(&data[16]);
1.971 + h->i_audio_channels = GST_READ_UINT32_LE(&data[20]);
1.972 + h->i_audio_compression_ratio = GST_READ_UINT32_LE(&data[24]);
1.973 + h->i_audio_quality = GST_READ_UINT32_LE(&data[28]);
1.974 + h->i_rtjpeg_quality = GST_READ_UINT32_LE(&data[32]);
1.975 + h->i_rtjpeg_luma_filter = GST_READ_UINT32_LE(&data[36]);
1.976 + h->i_rtjpeg_chroma_filter = GST_READ_UINT32_LE(&data[40]);
1.977 + h->i_lavc_bitrate = GST_READ_UINT32_LE(&data[44]);
1.978 + h->i_lavc_qmin = GST_READ_UINT32_LE(&data[48]);
1.979 + h->i_lavc_qmin = GST_READ_UINT32_LE(&data[52]);
1.980 + h->i_lavc_maxqdiff = GST_READ_UINT32_LE(&data[56]);
1.981 + h->i_seekable_offset = GST_READ_UINT64_LE(&data[60]);
1.982 + h->i_keyframe_adjust_offset = GST_READ_UINT64_LE(&data[68]);
1.983
1.984 - GST_DEBUG_OBJECT(nuv,
1.985 - "ex hdr: v=%d vffc=%4.4s afcc=%4.4s %dHz %dbits ach=%d acr=%d aq=%d"
1.986 - "rtjpeg q=%d lf=%d lc=%d lavc br=%d qmin=%d qmax=%d maxqdiff=%d seekableoff=%lld keyfao=%lld",
1.987 - h->i_version, (gchar *) & h->i_video_fcc,
1.988 - (gchar *) & h->i_audio_fcc, h->i_audio_sample_rate,
1.989 - h->i_audio_bits_per_sample, h->i_audio_channels,
1.990 - h->i_audio_compression_ratio, h->i_audio_quality,
1.991 - h->i_rtjpeg_quality, h->i_rtjpeg_luma_filter,
1.992 - h->i_rtjpeg_chroma_filter, h->i_lavc_bitrate,
1.993 - h->i_lavc_qmin, h->i_lavc_qmax, h->i_lavc_maxqdiff,
1.994 - h->i_seekable_offset, h->i_keyframe_adjust_offset);
1.995 + GST_DEBUG_OBJECT(nuv,
1.996 + "ex hdr: v=%d vffc=%4.4s afcc=%4.4s %dHz %dbits ach=%d acr=%d aq=%d"
1.997 + "rtjpeg q=%d lf=%d lc=%d lavc br=%d qmin=%d qmax=%d maxqdiff=%d seekableoff=%lld keyfao=%lld",
1.998 + h->i_version, (gchar *) & h->i_video_fcc,
1.999 + (gchar *) & h->i_audio_fcc, h->i_audio_sample_rate,
1.1000 + h->i_audio_bits_per_sample, h->i_audio_channels,
1.1001 + h->i_audio_compression_ratio, h->i_audio_quality,
1.1002 + h->i_rtjpeg_quality, h->i_rtjpeg_luma_filter,
1.1003 + h->i_rtjpeg_chroma_filter, h->i_lavc_bitrate,
1.1004 + h->i_lavc_qmin, h->i_lavc_qmax, h->i_lavc_maxqdiff,
1.1005 + h->i_seekable_offset, h->i_keyframe_adjust_offset);
1.1006
1.1007 -done:
1.1008 - if (buff != NULL)
1.1009 - {
1.1010 - gst_buffer_unref(buff);
1.1011 - buff = NULL;
1.1012 - }
1.1013 - return res;
1.1014 + done:
1.1015 + if (buff != NULL) {
1.1016 + gst_buffer_unref(buff);
1.1017 + buff = NULL;
1.1018 + }
1.1019 + return res;
1.1020 }
1.1021
1.1022
1.1023 -/* Query Functions */
1.1024 +/*
1.1025 + * Query Functions
1.1026 + */
1.1027 static const GstQueryType *
1.1028 gst_nuv_demux_get_src_query_types(GstPad * pad)
1.1029 {
1.1030 - static const GstQueryType src_types[] = {
1.1031 - GST_QUERY_POSITION,
1.1032 - GST_QUERY_DURATION,
1.1033 - 0
1.1034 - };
1.1035 + static const GstQueryType src_types[] = {
1.1036 + GST_QUERY_POSITION,
1.1037 + GST_QUERY_DURATION,
1.1038 + 0
1.1039 + };
1.1040
1.1041 - return src_types;
1.1042 + return src_types;
1.1043 }
1.1044
1.1045 -static gboolean
1.1046 +static gboolean
1.1047 gst_nuv_demux_handle_src_query(GstPad * pad, GstQuery * query)
1.1048 {
1.1049 - gboolean res = FALSE;
1.1050 - GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.1051 + gboolean res = FALSE;
1.1052 + GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.1053
1.1054
1.1055 - switch (GST_QUERY_TYPE(query))
1.1056 - {
1.1057 - case GST_QUERY_POSITION:
1.1058 - {
1.1059 - GstFormat format;
1.1060 - gst_query_parse_position(query, &format, NULL);
1.1061 - switch (format)
1.1062 - {
1.1063 - case GST_FORMAT_TIME:
1.1064 - if (GST_CLOCK_TIME_IS_VALID(nuv->priv->last_frame_time))
1.1065 - {
1.1066 - gst_query_set_position(query, GST_FORMAT_TIME,
1.1067 - nuv->priv->last_frame_time);
1.1068 - res = TRUE;
1.1069 - }
1.1070 - break;
1.1071 - default:
1.1072 - break;
1.1073 - }
1.1074 - break;
1.1075 - }
1.1076 - case GST_QUERY_DURATION:
1.1077 - {
1.1078 - GstFormat format;
1.1079 - gst_query_parse_duration(query, &format, NULL);
1.1080 - switch (format)
1.1081 - {
1.1082 - case GST_FORMAT_TIME:
1.1083 - if (nuv->priv->duration_time != GST_CLOCK_TIME_NONE)
1.1084 - {
1.1085 - gst_query_set_duration(query, GST_FORMAT_TIME,
1.1086 - nuv->priv->duration_time);
1.1087 - res = TRUE;
1.1088 - }
1.1089 - break;
1.1090 - default:
1.1091 - break;
1.1092 - }
1.1093 - break;
1.1094 - }
1.1095 - default:
1.1096 - break;
1.1097 - }
1.1098 + switch (GST_QUERY_TYPE(query)) {
1.1099 + case GST_QUERY_POSITION:
1.1100 + {
1.1101 + GstFormat format;
1.1102 + gst_query_parse_position(query, &format, NULL);
1.1103 + switch (format) {
1.1104 + case GST_FORMAT_TIME:
1.1105 + if (GST_CLOCK_TIME_IS_VALID(nuv->priv->last_frame_time)) {
1.1106 + gst_query_set_position(query, GST_FORMAT_TIME,
1.1107 + nuv->priv->last_frame_time);
1.1108 + res = TRUE;
1.1109 + }
1.1110 + break;
1.1111 + default:
1.1112 + break;
1.1113 + }
1.1114 + break;
1.1115 + }
1.1116 + case GST_QUERY_DURATION:
1.1117 + {
1.1118 + GstFormat format;
1.1119 + gst_query_parse_duration(query, &format, NULL);
1.1120 + switch (format) {
1.1121 + case GST_FORMAT_TIME:
1.1122 + if (nuv->priv->duration_time != GST_CLOCK_TIME_NONE) {
1.1123 + gst_query_set_duration(query, GST_FORMAT_TIME,
1.1124 + nuv->priv->duration_time);
1.1125 + res = TRUE;
1.1126 + }
1.1127 + break;
1.1128 + default:
1.1129 + break;
1.1130 + }
1.1131 + break;
1.1132 + }
1.1133 + default:
1.1134 + break;
1.1135 + }
1.1136
1.1137 - if (res == FALSE)
1.1138 - {
1.1139 - res = gst_pad_query_default(pad, query);
1.1140 - }
1.1141 + if (res == FALSE) {
1.1142 + res = gst_pad_query_default(pad, query);
1.1143 + }
1.1144
1.1145 - gst_object_unref(nuv);
1.1146 - return res;
1.1147 + gst_object_unref(nuv);
1.1148 + return res;
1.1149 }
1.1150
1.1151 -static GstPad *
1.1152 +static GstPad *
1.1153 gst_nuv_demux_create_pad(GstNuvDemux * nuv, GstCaps * caps,
1.1154 - GstStaticPadTemplate * template, const gchar * name)
1.1155 + GstStaticPadTemplate * template,
1.1156 + const gchar * name)
1.1157 {
1.1158 - GstPad *pad = NULL;
1.1159 - pad = gst_pad_new_from_static_template(template, name);
1.1160 - gst_pad_set_caps(pad, caps);
1.1161 - gst_pad_set_active(pad, TRUE);
1.1162 - gst_pad_use_fixed_caps(pad);
1.1163 - gst_element_add_pad(GST_ELEMENT(nuv), pad);
1.1164 + GstPad *pad = NULL;
1.1165 + pad = gst_pad_new_from_static_template(template, name);
1.1166 + gst_pad_set_caps(pad, caps);
1.1167 + gst_pad_set_active(pad, TRUE);
1.1168 + gst_pad_use_fixed_caps(pad);
1.1169 + gst_element_add_pad(GST_ELEMENT(nuv), pad);
1.1170
1.1171 - gst_pad_set_event_function(pad,
1.1172 - GST_DEBUG_FUNCPTR(gst_nuv_demux_srcpad_event));
1.1173 + gst_pad_set_event_function(pad,
1.1174 + GST_DEBUG_FUNCPTR
1.1175 + (gst_nuv_demux_srcpad_event));
1.1176
1.1177 - gst_pad_set_query_type_function(pad,
1.1178 - GST_DEBUG_FUNCPTR
1.1179 - (gst_nuv_demux_get_src_query_types));
1.1180 + gst_pad_set_query_type_function(pad,
1.1181 + GST_DEBUG_FUNCPTR
1.1182 + (gst_nuv_demux_get_src_query_types));
1.1183
1.1184 - gst_pad_set_query_function(pad,
1.1185 - GST_DEBUG_FUNCPTR
1.1186 - (gst_nuv_demux_handle_src_query));
1.1187 + gst_pad_set_query_function(pad,
1.1188 + GST_DEBUG_FUNCPTR
1.1189 + (gst_nuv_demux_handle_src_query));
1.1190
1.1191
1.1192 - return pad;
1.1193 + return pad;
1.1194 }
1.1195
1.1196 static void
1.1197 gst_nuv_demux_create_pads(GstNuvDemux * nuv)
1.1198 {
1.1199 - if (nuv->priv->h.i_video_blocks != 0)
1.1200 - {
1.1201 - GstCaps *video_caps = NULL;
1.1202 + if (nuv->priv->h.i_video_blocks != 0) {
1.1203 + GstCaps *video_caps = NULL;
1.1204
1.1205 - video_caps = gst_caps_new_simple("video/x-divx",
1.1206 - "divxversion", G_TYPE_INT, 4,
1.1207 - "width", G_TYPE_INT,
1.1208 - nuv->priv->h.i_width, "height",
1.1209 - G_TYPE_INT, nuv->priv->h.i_height,
1.1210 - "framerate", GST_TYPE_FRACTION,
1.1211 - nuv->priv->h.i_fpsn,
1.1212 - nuv->priv->h.i_fpsd, "format",
1.1213 - GST_TYPE_FOURCC,
1.1214 - nuv->priv->eh.i_video_fcc,
1.1215 - "pixel-aspect-ratio",
1.1216 - GST_TYPE_FRACTION,
1.1217 - (gint) (nuv->priv->h.d_aspect *
1.1218 - 1000.0f), 1000, NULL);
1.1219 + video_caps = gst_caps_new_simple("video/x-divx",
1.1220 + "divxversion", G_TYPE_INT, 4,
1.1221 + "width", G_TYPE_INT,
1.1222 + nuv->priv->h.i_width, "height",
1.1223 + G_TYPE_INT, nuv->priv->h.i_height,
1.1224 + "framerate", GST_TYPE_FRACTION,
1.1225 + nuv->priv->h.i_fpsn,
1.1226 + nuv->priv->h.i_fpsd, "format",
1.1227 + GST_TYPE_FOURCC,
1.1228 + nuv->priv->eh.i_video_fcc,
1.1229 + "pixel-aspect-ratio",
1.1230 + GST_TYPE_FRACTION,
1.1231 + (gint) (nuv->priv->h.d_aspect *
1.1232 + 1000.0f), 1000, NULL);
1.1233
1.1234 - nuv->priv->src_video_pad =
1.1235 - gst_nuv_demux_create_pad(nuv, video_caps, &video_src_template,
1.1236 - "video_src");
1.1237 - gst_caps_unref(video_caps);
1.1238 - }
1.1239 + nuv->priv->src_video_pad =
1.1240 + gst_nuv_demux_create_pad(nuv, video_caps, &video_src_template,
1.1241 + "video_src");
1.1242 + gst_caps_unref(video_caps);
1.1243 + }
1.1244
1.1245 - if (nuv->priv->h.i_audio_blocks != 0)
1.1246 - {
1.1247 - GstCaps *audio_caps = NULL;
1.1248 + if (nuv->priv->h.i_audio_blocks != 0) {
1.1249 + GstCaps *audio_caps = NULL;
1.1250
1.1251 - audio_caps = gst_caps_new_simple("audio/mpeg", "rate", G_TYPE_INT, nuv->priv->eh.i_audio_sample_rate, "format", GST_TYPE_FOURCC, nuv->priv->eh.i_audio_fcc, "channels", G_TYPE_INT, nuv->priv->eh.i_audio_channels, "layer", G_TYPE_INT, 3, // fixme: magic number
1.1252 - "mpegversion", G_TYPE_INT,
1.1253 - nuv->priv->eh.i_version, NULL);
1.1254 + audio_caps = gst_caps_new_simple("audio/mpeg", "rate", G_TYPE_INT, nuv->priv->eh.i_audio_sample_rate, "format", GST_TYPE_FOURCC, nuv->priv->eh.i_audio_fcc, "channels", G_TYPE_INT, nuv->priv->eh.i_audio_channels, "layer", G_TYPE_INT, 3, // fixme:
1.1255 + // magic
1.1256 + // number
1.1257 + "mpegversion", G_TYPE_INT,
1.1258 + nuv->priv->eh.i_version, NULL);
1.1259
1.1260 - nuv->priv->src_audio_pad =
1.1261 - gst_nuv_demux_create_pad(nuv, audio_caps, &audio_src_template,
1.1262 - "audio_src");
1.1263 - gst_caps_unref(audio_caps);
1.1264 - }
1.1265 + nuv->priv->src_audio_pad =
1.1266 + gst_nuv_demux_create_pad(nuv, audio_caps, &audio_src_template,
1.1267 + "audio_src");
1.1268 + gst_caps_unref(audio_caps);
1.1269 + }
1.1270
1.1271 - gst_element_no_more_pads(GST_ELEMENT(nuv));
1.1272 + gst_element_no_more_pads(GST_ELEMENT(nuv));
1.1273 }
1.1274
1.1275 -static gboolean
1.1276 +static gboolean
1.1277 gst_nuv_demux_validate_header(nuv_frame_header * h)
1.1278 {
1.1279 - gboolean valid = FALSE;
1.1280 - //g_usleep (1 * G_USEC_PER_SEC );
1.1281 - switch (h->i_type)
1.1282 - {
1.1283 -/*
1.1284 + gboolean valid = FALSE;
1.1285 + // g_usleep (1 * G_USEC_PER_SEC );
1.1286 + switch (h->i_type) {
1.1287 + /*
1.1288 + * case 'V': if (h->i_compression == 0 || h->i_compression == 1 ||
1.1289 + * h->i_compression == 2 || h->i_compression == 'N' ||
1.1290 + * h->i_compression == 'L') { valid = TRUE; } break; case 'A': if
1.1291 + * (h->i_compression == 0 || h->i_compression == 1 ||
1.1292 + * h->i_compression == 2 || h->i_compression == 3 ||
1.1293 + * h->i_compression == 'F' || h->i_compression == 'S' ||
1.1294 + * h->i_compression == 'N' || h->i_compression == 'L') { valid =
1.1295 + * TRUE; } break; case 'S': if (h->i_compression == 'B' ||
1.1296 + * h->i_compression == 'A' || h->i_compression == 'V' ||
1.1297 + * h->i_compression == 'S') { valid = TRUE; } break;
1.1298 + */
1.1299 + case 'A':
1.1300 case 'V':
1.1301 - if (h->i_compression == 0 ||
1.1302 - h->i_compression == 1 ||
1.1303 - h->i_compression == 2 ||
1.1304 - h->i_compression == 'N' ||
1.1305 - h->i_compression == 'L') {
1.1306 - valid = TRUE;
1.1307 - }
1.1308 - break;
1.1309 - case 'A':
1.1310 - if (h->i_compression == 0 ||
1.1311 - h->i_compression == 1 ||
1.1312 - h->i_compression == 2 ||
1.1313 - h->i_compression == 3 ||
1.1314 - h->i_compression == 'F' ||
1.1315 - h->i_compression == 'S' ||
1.1316 - h->i_compression == 'N' ||
1.1317 - h->i_compression == 'L') {
1.1318 - valid = TRUE;
1.1319 - }
1.1320 - break;
1.1321 case 'S':
1.1322 - if (h->i_compression == 'B' ||
1.1323 - h->i_compression == 'A' ||
1.1324 - h->i_compression == 'V' ||
1.1325 - h->i_compression == 'S') {
1.1326 - valid = TRUE;
1.1327 - }
1.1328 - break;
1.1329 -*/
1.1330 - case 'A':
1.1331 - case 'V':
1.1332 - case 'S':
1.1333 - case 'R':
1.1334 - case 'D':
1.1335 - case 'Q':
1.1336 - valid = TRUE;
1.1337 - break;
1.1338 - default:
1.1339 - valid = FALSE;
1.1340 - }
1.1341 + case 'R':
1.1342 + case 'D':
1.1343 + case 'Q':
1.1344 + valid = TRUE;
1.1345 + break;
1.1346 + default:
1.1347 + valid = FALSE;
1.1348 + }
1.1349
1.1350 - return valid;
1.1351 + return valid;
1.1352 }
1.1353
1.1354 -static GstFlowReturn
1.1355 +static GstFlowReturn
1.1356 gst_nuv_demux_read_head_frame(GstNuvDemux * nuv)
1.1357 {
1.1358 - GstFlowReturn ret = GST_FLOW_OK;
1.1359 - gboolean valid = FALSE;
1.1360 + GstFlowReturn ret = GST_FLOW_OK;
1.1361 + gboolean valid = FALSE;
1.1362
1.1363 - do
1.1364 - {
1.1365 - ret = gst_nuv_demux_frame_header_load(nuv, &nuv->priv->fh);
1.1366 - if (ret != GST_FLOW_OK)
1.1367 - {
1.1368 - return ret;
1.1369 - }
1.1370 + do {
1.1371 + ret = gst_nuv_demux_frame_header_load(nuv, &nuv->priv->fh);
1.1372 + if (ret != GST_FLOW_OK) {
1.1373 + return ret;
1.1374 + }
1.1375
1.1376 - if (gst_nuv_demux_validate_header(&nuv->priv->fh) == TRUE)
1.1377 - valid = TRUE;
1.1378 + if (gst_nuv_demux_validate_header(&nuv->priv->fh) == TRUE)
1.1379 + valid = TRUE;
1.1380
1.1381 - }
1.1382 - while (valid == FALSE);
1.1383 + }
1.1384 + while (valid == FALSE);
1.1385
1.1386 - nuv->priv->state = GST_NUV_DEMUX_MOVI;
1.1387 - return ret;
1.1388 + nuv->priv->state = GST_NUV_DEMUX_MOVI;
1.1389 + return ret;
1.1390 }
1.1391
1.1392 -static gboolean
1.1393 +static gboolean
1.1394 gst_nuv_combine_flow(GstNuvDemux * nuv)
1.1395 {
1.1396 - GstFlowReturn ret_video = nuv->priv->last_video_return;
1.1397 - GstFlowReturn ret_audio = nuv->priv->last_audio_return;
1.1398 + GstFlowReturn ret_video = nuv->priv->last_video_return;
1.1399 + GstFlowReturn ret_audio = nuv->priv->last_audio_return;
1.1400
1.1401 - if ((ret_video != GST_FLOW_OK) && (ret_audio != GST_FLOW_OK))
1.1402 - return FALSE;
1.1403 + if ((ret_video != GST_FLOW_OK) && (ret_audio != GST_FLOW_OK))
1.1404 + return FALSE;
1.1405
1.1406 - if (GST_FLOW_IS_FATAL(ret_video))
1.1407 - return FALSE;
1.1408 + if (GST_FLOW_IS_FATAL(ret_video))
1.1409 + return FALSE;
1.1410
1.1411 - if (GST_FLOW_IS_FATAL(ret_audio))
1.1412 - return FALSE;
1.1413 + if (GST_FLOW_IS_FATAL(ret_audio))
1.1414 + return FALSE;
1.1415
1.1416 - return TRUE;
1.1417 + return TRUE;
1.1418 }
1.1419
1.1420 -static GstFlowReturn
1.1421 +static GstFlowReturn
1.1422 gst_nuv_demux_stream_data(GstNuvDemux * nuv)
1.1423 {
1.1424 - GstFlowReturn ret = GST_FLOW_OK;
1.1425 - GstPad *pad = NULL;
1.1426 - guint64 timestamp;
1.1427 - GstBuffer *buf = NULL;
1.1428 - nuv_frame_header h;
1.1429 + GstFlowReturn ret = GST_FLOW_OK;
1.1430 + GstPad *pad = NULL;
1.1431 + guint64 timestamp;
1.1432 + GstBuffer *buf = NULL;
1.1433 + nuv_frame_header h;
1.1434
1.1435 - h = nuv->priv->fh;
1.1436 + h = nuv->priv->fh;
1.1437
1.1438 - if (h.i_type == 'R')
1.1439 - {
1.1440 - goto done;
1.1441 - }
1.1442 + if (h.i_type == 'R') {
1.1443 + goto done;
1.1444 + }
1.1445
1.1446 - if (h.i_length > 0)
1.1447 - {
1.1448 - ret = gst_nuv_demux_read_bytes(nuv, h.i_length, TRUE, &buf);
1.1449 - if ((ret != GST_FLOW_OK) || (buf == NULL))
1.1450 - {
1.1451 - goto done;
1.1452 - }
1.1453 + if (h.i_length > 0) {
1.1454 + ret = gst_nuv_demux_read_bytes(nuv, h.i_length, TRUE, &buf);
1.1455 + if ((ret != GST_FLOW_OK) || (buf == NULL)) {
1.1456 + goto done;
1.1457 + }
1.1458
1.1459 - if ((h.i_timecode < 0))
1.1460 - {
1.1461 - h.i_timecode = 0;
1.1462 - //goto done;
1.1463 - }
1.1464 + if ((h.i_timecode < 0)) {
1.1465 + h.i_timecode = 0;
1.1466 + // goto done;
1.1467 + }
1.1468
1.1469 - timestamp = h.i_timecode * GST_MSECOND;
1.1470 - GST_BUFFER_TIMESTAMP(buf) = timestamp;
1.1471 - }
1.1472 - else
1.1473 - {
1.1474 - goto done;
1.1475 - }
1.1476 + timestamp = h.i_timecode * GST_MSECOND;
1.1477 + GST_BUFFER_TIMESTAMP(buf) = timestamp;
1.1478 + } else {
1.1479 + goto done;
1.1480 + }
1.1481
1.1482
1.1483 - switch (h.i_type)
1.1484 - {
1.1485 - case 'V':
1.1486 - {
1.1487 - pad = nuv->priv->src_video_pad;
1.1488 + switch (h.i_type) {
1.1489 + case 'V':
1.1490 + {
1.1491 + pad = nuv->priv->src_video_pad;
1.1492
1.1493 - if (nuv->priv->new_video_segment)
1.1494 - {
1.1495 + if (nuv->priv->new_video_segment) {
1.1496
1.1497 - /* send new segment event */
1.1498 - gst_pad_push_event(nuv->priv->src_video_pad,
1.1499 - gst_event_new_new_segment(TRUE, 1.0,
1.1500 - GST_FORMAT_TIME, 0,
1.1501 - GST_CLOCK_TIME_NONE,
1.1502 - 0));
1.1503 + /*
1.1504 + * send new segment event
1.1505 + */
1.1506 + gst_pad_push_event(nuv->priv->src_video_pad,
1.1507 + gst_event_new_new_segment(TRUE, 1.0,
1.1508 + GST_FORMAT_TIME,
1.1509 + 0,
1.1510 + GST_CLOCK_TIME_NONE,
1.1511 + 0));
1.1512
1.1513 - if (nuv->priv->time_start == GST_CLOCK_TIME_NONE)
1.1514 - {
1.1515 - nuv->priv->time_start = timestamp;
1.1516 - }
1.1517 - nuv->priv->new_video_segment = FALSE;
1.1518 - }
1.1519 + if (nuv->priv->time_start == GST_CLOCK_TIME_NONE) {
1.1520 + nuv->priv->time_start = timestamp;
1.1521 + }
1.1522 + nuv->priv->new_video_segment = FALSE;
1.1523 + }
1.1524
1.1525 - break;
1.1526 - }
1.1527 - case 'A':
1.1528 - {
1.1529 - pad = nuv->priv->src_audio_pad;
1.1530 + break;
1.1531 + }
1.1532 + case 'A':
1.1533 + {
1.1534 + pad = nuv->priv->src_audio_pad;
1.1535
1.1536 - if (nuv->priv->new_audio_segment)
1.1537 - {
1.1538 - /* send new segment event */
1.1539 - gst_pad_push_event(nuv->priv->src_audio_pad,
1.1540 - gst_event_new_new_segment(TRUE, 1.0,
1.1541 - GST_FORMAT_TIME, 0,
1.1542 - GST_CLOCK_TIME_NONE,
1.1543 - 0));
1.1544 + if (nuv->priv->new_audio_segment) {
1.1545 + /*
1.1546 + * send new segment event
1.1547 + */
1.1548 + gst_pad_push_event(nuv->priv->src_audio_pad,
1.1549 + gst_event_new_new_segment(TRUE, 1.0,
1.1550 + GST_FORMAT_TIME,
1.1551 + 0,
1.1552 + GST_CLOCK_TIME_NONE,
1.1553 + 0));
1.1554
1.1555 - if (nuv->priv->time_start == GST_CLOCK_TIME_NONE)
1.1556 - {
1.1557 - nuv->priv->time_start = timestamp;
1.1558 - }
1.1559 - nuv->priv->new_audio_segment = FALSE;
1.1560 - }
1.1561 + if (nuv->priv->time_start == GST_CLOCK_TIME_NONE) {
1.1562 + nuv->priv->time_start = timestamp;
1.1563 + }
1.1564 + nuv->priv->new_audio_segment = FALSE;
1.1565 + }
1.1566
1.1567 - break;
1.1568 - }
1.1569 - case 'S':
1.1570 - {
1.1571 - switch (h.i_compression)
1.1572 - {
1.1573 - case 'V':
1.1574 - GST_DEBUG_OBJECT(nuv, "sending new video segment: %d",
1.1575 - h.i_timecode);
1.1576 - gst_pad_push_event(nuv->priv->src_video_pad,
1.1577 - gst_event_new_new_segment(TRUE, 1.0,
1.1578 - GST_FORMAT_TIME,
1.1579 - h.i_timecode *
1.1580 - GST_MSECOND,
1.1581 - GST_CLOCK_TIME_NONE,
1.1582 - 0));
1.1583 - break;
1.1584 - case 'A':
1.1585 - GST_DEBUG_OBJECT(nuv, "sending new audio segment: %d",
1.1586 - h.i_timecode);
1.1587 - gst_pad_push_event(nuv->priv->src_audio_pad,
1.1588 - gst_event_new_new_segment(TRUE, 1.0,
1.1589 - GST_FORMAT_TIME, 0,
1.1590 - GST_CLOCK_TIME_NONE,
1.1591 - 0));
1.1592 - break;
1.1593 - default:
1.1594 - break;
1.1595 - }
1.1596 - goto done;
1.1597 - }
1.1598 - default:
1.1599 - break;
1.1600 - }
1.1601 + break;
1.1602 + }
1.1603 + case 'S':
1.1604 + {
1.1605 + switch (h.i_compression) {
1.1606 + case 'V':
1.1607 + GST_DEBUG_OBJECT(nuv, "sending new video segment: %d",
1.1608 + h.i_timecode);
1.1609 + gst_pad_push_event(nuv->priv->src_video_pad,
1.1610 + gst_event_new_new_segment(TRUE, 1.0,
1.1611 + GST_FORMAT_TIME,
1.1612 + h.i_timecode *
1.1613 + GST_MSECOND,
1.1614 + GST_CLOCK_TIME_NONE,
1.1615 + 0));
1.1616 + break;
1.1617 + case 'A':
1.1618 + GST_DEBUG_OBJECT(nuv, "sending new audio segment: %d",
1.1619 + h.i_timecode);
1.1620 + gst_pad_push_event(nuv->priv->src_audio_pad,
1.1621 + gst_event_new_new_segment(TRUE, 1.0,
1.1622 + GST_FORMAT_TIME,
1.1623 + 0,
1.1624 + GST_CLOCK_TIME_NONE,
1.1625 + 0));
1.1626 + break;
1.1627 + default:
1.1628 + break;
1.1629 + }
1.1630 + goto done;
1.1631 + }
1.1632 + default:
1.1633 + break;
1.1634 + }
1.1635
1.1636 - if ((buf != NULL) && (pad != NULL))
1.1637 - {
1.1638 - /* pushing the buffer */
1.1639 - gst_buffer_set_caps(buf, GST_PAD_CAPS(pad));
1.1640 - ret = gst_pad_push(pad, buf);
1.1641 - buf = NULL;
1.1642 + if ((buf != NULL) && (pad != NULL)) {
1.1643 + /*
1.1644 + * pushing the buffer
1.1645 + */
1.1646 + gst_buffer_set_caps(buf, GST_PAD_CAPS(pad));
1.1647 + ret = gst_pad_push(pad, buf);
1.1648 + buf = NULL;
1.1649
1.1650 - if (ret != GST_FLOW_OK)
1.1651 - {
1.1652 - GST_WARNING_OBJECT(nuv, "error: %d pushing on srcpad %s", ret,
1.1653 - gst_pad_get_name(pad));
1.1654 + if (ret != GST_FLOW_OK) {
1.1655 + GST_WARNING_OBJECT(nuv, "error: %d pushing on srcpad %s", ret,
1.1656 + gst_pad_get_name(pad));
1.1657
1.1658 - if (pad == nuv->priv->src_video_pad)
1.1659 - {
1.1660 - nuv->priv->last_video_return = ret;
1.1661 - }
1.1662 - else if (pad == nuv->priv->src_audio_pad)
1.1663 - {
1.1664 - nuv->priv->last_audio_return = ret;
1.1665 - }
1.1666 + if (pad == nuv->priv->src_video_pad) {
1.1667 + nuv->priv->last_video_return = ret;
1.1668 + } else if (pad == nuv->priv->src_audio_pad) {
1.1669 + nuv->priv->last_audio_return = ret;
1.1670 + }
1.1671
1.1672 - /* verify anothers flow if is necessary stop task */
1.1673 - if (gst_nuv_combine_flow(nuv) != FALSE)
1.1674 - {
1.1675 - ret = GST_FLOW_OK;
1.1676 - }
1.1677 - else
1.1678 - {
1.1679 - GST_WARNING_OBJECT(nuv, "error: on push");
1.1680 - }
1.1681 + /*
1.1682 + * verify anothers flow if is necessary stop task
1.1683 + */
1.1684 + if (gst_nuv_combine_flow(nuv) != FALSE) {
1.1685 + ret = GST_FLOW_OK;
1.1686 + } else {
1.1687 + GST_WARNING_OBJECT(nuv, "error: on push");
1.1688 + }
1.1689
1.1690 - }
1.1691 - }
1.1692 + }
1.1693 + }
1.1694
1.1695 -done:
1.1696 - if (buf != NULL)
1.1697 - {
1.1698 - gst_buffer_unref(buf);
1.1699 - buf = NULL;
1.1700 - }
1.1701 - if (ret == GST_FLOW_OK)
1.1702 - {
1.1703 - nuv->priv->state = GST_NUV_DEMUX_FRAME_HEADER;
1.1704 - memset(&nuv->priv->fh, 0, sizeof(nuv->priv->fh));
1.1705 - }
1.1706 - return ret;
1.1707 + done:
1.1708 + if (buf != NULL) {
1.1709 + gst_buffer_unref(buf);
1.1710 + buf = NULL;
1.1711 + }
1.1712 + if (ret == GST_FLOW_OK) {
1.1713 + nuv->priv->state = GST_NUV_DEMUX_FRAME_HEADER;
1.1714 + memset(&nuv->priv->fh, 0, sizeof(nuv->priv->fh));
1.1715 + }
1.1716 + return ret;
1.1717 }
1.1718
1.1719 -static GstFlowReturn
1.1720 +static GstFlowReturn
1.1721 gst_nuv_demux_stream_mpeg_data(GstNuvDemux * nuv)
1.1722 {
1.1723 - GstFlowReturn ret = GST_FLOW_OK;
1.1724 + GstFlowReturn ret = GST_FLOW_OK;
1.1725
1.1726 - /* ffmpeg extra data */
1.1727 - if (nuv->priv->new_file)
1.1728 - {
1.1729 - GstBuffer *buf;
1.1730 - ret =
1.1731 - gst_nuv_demux_read_bytes(nuv, nuv->priv->mpeg_data_size, TRUE, &buf);
1.1732 - gst_buffer_unref(buf);
1.1733 - }
1.1734 - else
1.1735 - {
1.1736 - ret = gst_nuv_demux_read_bytes(nuv, nuv->priv->mpeg_data_size, TRUE,
1.1737 - &nuv->priv->mpeg_buffer);
1.1738 - }
1.1739 + /*
1.1740 + * ffmpeg extra data
1.1741 + */
1.1742 + if (nuv->priv->new_file) {
1.1743 + GstBuffer *buf;
1.1744 + ret =
1.1745 + gst_nuv_demux_read_bytes(nuv, nuv->priv->mpeg_data_size, TRUE,
1.1746 + &buf);
1.1747 + gst_buffer_unref(buf);
1.1748 + } else {
1.1749 + ret =
1.1750 + gst_nuv_demux_read_bytes(nuv, nuv->priv->mpeg_data_size, TRUE,
1.1751 + &nuv->priv->mpeg_buffer);
1.1752 + }
1.1753
1.1754 - if ((ret != GST_FLOW_OK) || (nuv->priv->mpeg_buffer == NULL))
1.1755 - {
1.1756 - return ret;
1.1757 - }
1.1758 + if ((ret != GST_FLOW_OK) || (nuv->priv->mpeg_buffer == NULL)) {
1.1759 + return ret;
1.1760 + }
1.1761
1.1762 - GST_BUFFER_SIZE(nuv->priv->mpeg_buffer) = nuv->priv->mpeg_data_size;
1.1763 - nuv->priv->state = GST_NUV_DEMUX_EXTEND_HEADER;
1.1764 - return ret;
1.1765 + GST_BUFFER_SIZE(nuv->priv->mpeg_buffer) = nuv->priv->mpeg_data_size;
1.1766 + nuv->priv->state = GST_NUV_DEMUX_EXTEND_HEADER;
1.1767 + return ret;
1.1768 }
1.1769
1.1770 -static GstFlowReturn
1.1771 +static GstFlowReturn
1.1772 gst_nuv_demux_stream_extra_data(GstNuvDemux * nuv)
1.1773 {
1.1774 - GstFlowReturn ret = GST_FLOW_OK;
1.1775 + GstFlowReturn ret = GST_FLOW_OK;
1.1776
1.1777 - /* Load 'D' */
1.1778 - nuv_frame_header h;
1.1779 + /*
1.1780 + * Load 'D'
1.1781 + */
1.1782 + nuv_frame_header h;
1.1783
1.1784 - if (nuv->priv->new_file)
1.1785 - ret = gst_nuv_demux_frame_header_load(nuv, NULL);
1.1786 - else
1.1787 - ret = gst_nuv_demux_frame_header_load(nuv, &h);
1.1788 + if (nuv->priv->new_file)
1.1789 + ret = gst_nuv_demux_frame_header_load(nuv, NULL);
1.1790 + else
1.1791 + ret = gst_nuv_demux_frame_header_load(nuv, &h);
1.1792
1.1793 - if (ret != GST_FLOW_OK)
1.1794 - return ret;
1.1795 + if (ret != GST_FLOW_OK)
1.1796 + return ret;
1.1797
1.1798 - if (h.i_type != 'D')
1.1799 - {
1.1800 - GST_WARNING_OBJECT(nuv, "Unsuported rtjpeg");
1.1801 - return GST_FLOW_NOT_SUPPORTED;
1.1802 - }
1.1803 + if (h.i_type != 'D') {
1.1804 + GST_WARNING_OBJECT(nuv, "Unsuported rtjpeg");
1.1805 + return GST_FLOW_NOT_SUPPORTED;
1.1806 + }
1.1807
1.1808 - if (h.i_length > 0)
1.1809 - {
1.1810 - if (h.i_compression == 'F')
1.1811 - {
1.1812 - nuv->priv->state = GST_NUV_DEMUX_MPEG_DATA;
1.1813 - }
1.1814 - else
1.1815 - {
1.1816 - GST_WARNING_OBJECT(nuv,
1.1817 - "only file with extended chunk are supported");
1.1818 - return GST_FLOW_NOT_SUPPORTED;
1.1819 - }
1.1820 - }
1.1821 - else
1.1822 - {
1.1823 - nuv->priv->state = GST_NUV_DEMUX_EXTEND_HEADER;
1.1824 - }
1.1825 + if (h.i_length > 0) {
1.1826 + if (h.i_compression == 'F') {
1.1827 + nuv->priv->state = GST_NUV_DEMUX_MPEG_DATA;
1.1828 + } else {
1.1829 + GST_WARNING_OBJECT(nuv,
1.1830 + "only file with extended chunk are supported");
1.1831 + return GST_FLOW_NOT_SUPPORTED;
1.1832 + }
1.1833 + } else {
1.1834 + nuv->priv->state = GST_NUV_DEMUX_EXTEND_HEADER;
1.1835 + }
1.1836
1.1837 - return ret;
1.1838 + return ret;
1.1839 }
1.1840
1.1841 -static GstFlowReturn
1.1842 +static GstFlowReturn
1.1843 gst_nuv_demux_stream_extend_header_data(GstNuvDemux * nuv)
1.1844 {
1.1845 - GstFlowReturn ret = GST_FLOW_OK;
1.1846 + GstFlowReturn ret = GST_FLOW_OK;
1.1847
1.1848 - if (nuv->priv->new_file)
1.1849 - ret = gst_nuv_demux_extended_header_load(nuv, NULL);
1.1850 - else
1.1851 - {
1.1852 - ret = gst_nuv_demux_extended_header_load(nuv, &nuv->priv->eh);
1.1853 - if (ret != GST_FLOW_OK)
1.1854 - return ret;
1.1855 - gst_nuv_demux_create_pads(nuv);
1.1856 - }
1.1857 + if (nuv->priv->new_file)
1.1858 + ret = gst_nuv_demux_extended_header_load(nuv, NULL);
1.1859 + else {
1.1860 + ret = gst_nuv_demux_extended_header_load(nuv, &nuv->priv->eh);
1.1861 + if (ret != GST_FLOW_OK)
1.1862 + return ret;
1.1863 + gst_nuv_demux_create_pads(nuv);
1.1864 + }
1.1865
1.1866 - nuv->priv->state = GST_NUV_DEMUX_INDEX_CREATE;
1.1867 - return ret;
1.1868 + nuv->priv->state = GST_NUV_DEMUX_INDEX_CREATE;
1.1869 + return ret;
1.1870 }
1.1871
1.1872 -static GstFlowReturn
1.1873 +static GstFlowReturn
1.1874 gst_nuv_demux_stream_extend_header(GstNuvDemux * nuv)
1.1875 {
1.1876 - GstBuffer *buf = NULL;
1.1877 - GstFlowReturn res = GST_FLOW_OK;
1.1878 + GstBuffer *buf = NULL;
1.1879 + GstFlowReturn res = GST_FLOW_OK;
1.1880
1.1881 - res = gst_nuv_demux_read_bytes(nuv, 1, FALSE, &buf);
1.1882 - if ((res != GST_FLOW_OK) || (buf == NULL))
1.1883 - {
1.1884 - if (buf != NULL)
1.1885 - {
1.1886 - gst_buffer_unref(buf);
1.1887 - }
1.1888 - return res;
1.1889 - }
1.1890 + res = gst_nuv_demux_read_bytes(nuv, 1, FALSE, &buf);
1.1891 + if ((res != GST_FLOW_OK) || (buf == NULL)) {
1.1892 + if (buf != NULL) {
1.1893 + gst_buffer_unref(buf);
1.1894 + }
1.1895 + return res;
1.1896 + }
1.1897
1.1898 - if (buf->data[0] == 'X')
1.1899 - {
1.1900 - gst_buffer_unref(buf);
1.1901 - buf = NULL;
1.1902 - nuv_frame_header h;
1.1903 + if (buf->data[0] == 'X') {
1.1904 + gst_buffer_unref(buf);
1.1905 + buf = NULL;
1.1906 + nuv_frame_header h;
1.1907
1.1908 - res = gst_nuv_demux_frame_header_load(nuv, &h);
1.1909 - if (res != GST_FLOW_OK)
1.1910 - return res;
1.1911 + res = gst_nuv_demux_frame_header_load(nuv, &h);
1.1912 + if (res != GST_FLOW_OK)
1.1913 + return res;
1.1914
1.1915 - if (h.i_length != 512)
1.1916 - {
1.1917 - return GST_FLOW_ERROR;
1.1918 - }
1.1919 - nuv->priv->state = GST_NUV_DEMUX_EXTEND_HEADER_DATA;
1.1920 - }
1.1921 - else
1.1922 - {
1.1923 - nuv->priv->state = GST_NUV_DEMUX_INVALID_DATA;
1.1924 - g_object_unref(buf);
1.1925 - GST_ELEMENT_WARNING(nuv, STREAM, FAILED,
1.1926 - (_("incomplete NUV support")),
1.1927 - ("incomplete NUV support"));
1.1928 - return GST_FLOW_ERROR;
1.1929 - }
1.1930 - return res;
1.1931 + if (h.i_length != 512) {
1.1932 + return GST_FLOW_ERROR;
1.1933 + }
1.1934 + nuv->priv->state = GST_NUV_DEMUX_EXTEND_HEADER_DATA;
1.1935 + } else {
1.1936 + nuv->priv->state = GST_NUV_DEMUX_INVALID_DATA;
1.1937 + g_object_unref(buf);
1.1938 + GST_ELEMENT_WARNING(nuv, STREAM, FAILED,
1.1939 + (_("incomplete NUV support")),
1.1940 + ("incomplete NUV support"));
1.1941 + return GST_FLOW_ERROR;
1.1942 + }
1.1943 + return res;
1.1944 }
1.1945
1.1946 static void
1.1947 gst_nuv_demux_create_seek_index(GstNuvDemux * nuv)
1.1948 {
1.1949 - GstMessage *msg;
1.1950 - nuv_frame_header h;
1.1951 + GstMessage *msg;
1.1952 + nuv_frame_header h;
1.1953
1.1954 - while (gst_nuv_demux_frame_header_load(nuv, &h) == GST_FLOW_OK)
1.1955 - {
1.1956 - if ((h.i_type == 'V') && (h.i_keyframe == 0))
1.1957 - {
1.1958 - frame_index_data *f = g_new0(frame_index_data, 1);
1.1959 + while (gst_nuv_demux_frame_header_load(nuv, &h) == GST_FLOW_OK) {
1.1960 + if ((h.i_type == 'V') && (h.i_keyframe == 0)) {
1.1961 + frame_index_data *f = g_new0(frame_index_data, 1);
1.1962
1.1963 - f->offset = nuv->priv->offset - 12;
1.1964 - f->timecode = h.i_timecode * GST_MSECOND;
1.1965 + f->offset = nuv->priv->offset - 12;
1.1966 + f->timecode = h.i_timecode * GST_MSECOND;
1.1967
1.1968 - nuv->priv->index = g_slist_append(nuv->priv->index, f);
1.1969 - }
1.1970 - if (h.i_type != 'R')
1.1971 - {
1.1972 - nuv->priv->offset += h.i_length;
1.1973 - if (h.i_type == 'A' || h.i_type == 'V')
1.1974 - nuv->priv->duration_time = h.i_timecode * GST_MSECOND;
1.1975 - }
1.1976 - }
1.1977 - GST_DEBUG_OBJECT(nuv,
1.1978 - "CREATING INDEX: DONE : DURATION Bytes/Sec: %"
1.1979 - G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, nuv->priv->offset,
1.1980 - nuv->priv->duration_time);
1.1981 + nuv->priv->index = g_slist_append(nuv->priv->index, f);
1.1982 + }
1.1983 + if (h.i_type != 'R') {
1.1984 + nuv->priv->offset += h.i_length;
1.1985 + if (h.i_type == 'A' || h.i_type == 'V')
1.1986 + nuv->priv->duration_time = h.i_timecode * GST_MSECOND;
1.1987 + }
1.1988 + }
1.1989 + GST_DEBUG_OBJECT(nuv,
1.1990 + "CREATING INDEX: DONE : DURATION Bytes/Sec: %"
1.1991 + G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
1.1992 + nuv->priv->offset, nuv->priv->duration_time);
1.1993
1.1994 - nuv->priv->duration_bytes = nuv->priv->offset;
1.1995 - nuv->priv->offset = nuv->priv->header_lengh;
1.1996 + nuv->priv->duration_bytes = nuv->priv->offset;
1.1997 + nuv->priv->offset = nuv->priv->header_lengh;
1.1998
1.1999 - msg =
1.2000 - gst_message_new_duration(GST_OBJECT(nuv), GST_FORMAT_TIME,
1.2001 - nuv->priv->duration_time);
1.2002 - gst_element_post_message(GST_ELEMENT(nuv), msg);
1.2003 + msg =
1.2004 + gst_message_new_duration(GST_OBJECT(nuv), GST_FORMAT_TIME,
1.2005 + nuv->priv->duration_time);
1.2006 + gst_element_post_message(GST_ELEMENT(nuv), msg);
1.2007 }
1.2008
1.2009 -static GstFlowReturn
1.2010 +static GstFlowReturn
1.2011 gst_nuv_demux_play(GstPad * pad)
1.2012 {
1.2013 - GstFlowReturn res = GST_FLOW_OK;
1.2014 - GstNuvDemux *nuv = GST_NUV_DEMUX(GST_PAD_PARENT(pad));
1.2015 + GstFlowReturn res = GST_FLOW_OK;
1.2016 + GstNuvDemux *nuv = GST_NUV_DEMUX(GST_PAD_PARENT(pad));
1.2017
1.2018 - switch (nuv->priv->state)
1.2019 - {
1.2020 - case GST_NUV_DEMUX_START:
1.2021 - res = gst_nuv_demux_stream_file_header(nuv);
1.2022 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2023 - {
1.2024 - goto pause;
1.2025 - }
1.2026 - break;
1.2027 + switch (nuv->priv->state) {
1.2028 + case GST_NUV_DEMUX_START:
1.2029 + res = gst_nuv_demux_stream_file_header(nuv);
1.2030 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2031 + goto pause;
1.2032 + }
1.2033 + break;
1.2034
1.2035 - case GST_NUV_DEMUX_HEADER_DATA:
1.2036 - res = gst_nuv_demux_stream_header_data(nuv);
1.2037 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2038 - {
1.2039 - goto pause;
1.2040 - }
1.2041 - break;
1.2042 + case GST_NUV_DEMUX_HEADER_DATA:
1.2043 + res = gst_nuv_demux_stream_header_data(nuv);
1.2044 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2045 + goto pause;
1.2046 + }
1.2047 + break;
1.2048
1.2049 - case GST_NUV_DEMUX_EXTRA_DATA:
1.2050 - res = gst_nuv_demux_stream_extra_data(nuv);
1.2051 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2052 - {
1.2053 - goto pause;
1.2054 - }
1.2055 - break;
1.2056 + case GST_NUV_DEMUX_EXTRA_DATA:
1.2057 + res = gst_nuv_demux_stream_extra_data(nuv);
1.2058 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2059 + goto pause;
1.2060 + }
1.2061 + break;
1.2062
1.2063 - case GST_NUV_DEMUX_MPEG_DATA:
1.2064 - res = gst_nuv_demux_stream_mpeg_data(nuv);
1.2065 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2066 - {
1.2067 - goto pause;
1.2068 - }
1.2069 - break;
1.2070 + case GST_NUV_DEMUX_MPEG_DATA:
1.2071 + res = gst_nuv_demux_stream_mpeg_data(nuv);
1.2072 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2073 + goto pause;
1.2074 + }
1.2075 + break;
1.2076
1.2077 - case GST_NUV_DEMUX_EXTEND_HEADER:
1.2078 - res = gst_nuv_demux_stream_extend_header(nuv);
1.2079 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2080 - {
1.2081 - goto pause;
1.2082 - }
1.2083 - break;
1.2084 + case GST_NUV_DEMUX_EXTEND_HEADER:
1.2085 + res = gst_nuv_demux_stream_extend_header(nuv);
1.2086 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2087 + goto pause;
1.2088 + }
1.2089 + break;
1.2090
1.2091 - case GST_NUV_DEMUX_EXTEND_HEADER_DATA:
1.2092 - res = gst_nuv_demux_stream_extend_header_data(nuv);
1.2093 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2094 - {
1.2095 - goto pause;
1.2096 - }
1.2097 - //store file header size
1.2098 - nuv->priv->header_lengh = nuv->priv->offset;
1.2099 - break;
1.2100 + case GST_NUV_DEMUX_EXTEND_HEADER_DATA:
1.2101 + res = gst_nuv_demux_stream_extend_header_data(nuv);
1.2102 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2103 + goto pause;
1.2104 + }
1.2105 + // store file header size
1.2106 + nuv->priv->header_lengh = nuv->priv->offset;
1.2107 + break;
1.2108
1.2109 - case GST_NUV_DEMUX_INDEX_CREATE:
1.2110 - if ((nuv->priv->mode == NUV_PULL_MODE) && (!nuv->priv->new_file))
1.2111 - {
1.2112 - gst_nuv_demux_create_seek_index(nuv);
1.2113 - }
1.2114 + case GST_NUV_DEMUX_INDEX_CREATE:
1.2115 + if ((nuv->priv->mode == NUV_PULL_MODE) && (!nuv->priv->new_file)) {
1.2116 + gst_nuv_demux_create_seek_index(nuv);
1.2117 + }
1.2118
1.2119 - case GST_NUV_DEMUX_FRAME_HEADER:
1.2120 - res = gst_nuv_demux_read_head_frame(nuv);
1.2121 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2122 - {
1.2123 - goto pause;
1.2124 - }
1.2125 - break;
1.2126 + case GST_NUV_DEMUX_FRAME_HEADER:
1.2127 + res = gst_nuv_demux_read_head_frame(nuv);
1.2128 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2129 + goto pause;
1.2130 + }
1.2131 + break;
1.2132
1.2133 - case GST_NUV_DEMUX_MOVI:
1.2134 - res = gst_nuv_demux_stream_data(nuv);
1.2135 - if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA))
1.2136 - {
1.2137 - goto pause;
1.2138 - }
1.2139 - break;
1.2140 + case GST_NUV_DEMUX_MOVI:
1.2141 + res = gst_nuv_demux_stream_data(nuv);
1.2142 + if ((res != GST_FLOW_OK) && (res != GST_FLOW_ERROR_NO_DATA)) {
1.2143 + goto pause;
1.2144 + }
1.2145 + break;
1.2146
1.2147 - case GST_NUV_DEMUX_INVALID_DATA:
1.2148 - goto pause;
1.2149 - break;
1.2150 - default:
1.2151 - g_assert_not_reached();
1.2152 - }
1.2153 + case GST_NUV_DEMUX_INVALID_DATA:
1.2154 + goto pause;
1.2155 + break;
1.2156 + default:
1.2157 + g_assert_not_reached();
1.2158 + }
1.2159
1.2160 - return GST_FLOW_OK;
1.2161 + return GST_FLOW_OK;
1.2162
1.2163 -pause:
1.2164 - GST_LOG_OBJECT(nuv, "pausing task, reason %s", gst_flow_get_name(res));
1.2165 - gst_pad_pause_task(nuv->priv->sinkpad);
1.2166 + pause:
1.2167 + GST_LOG_OBJECT(nuv, "pausing task, reason %s", gst_flow_get_name(res));
1.2168 + gst_pad_pause_task(nuv->priv->sinkpad);
1.2169
1.2170 - if (res == GST_FLOW_ERROR_EOS)
1.2171 - {
1.2172 - gst_nuv_demux_send_eos(nuv);
1.2173 - nuv->priv->eos = TRUE;
1.2174 - res = GST_FLOW_OK;
1.2175 - }
1.2176 + if (res == GST_FLOW_ERROR_EOS) {
1.2177 + gst_nuv_demux_send_eos(nuv);
1.2178 + nuv->priv->eos = TRUE;
1.2179 + res = GST_FLOW_OK;
1.2180 + }
1.2181
1.2182 - if (GST_FLOW_IS_FATAL(res))
1.2183 - {
1.2184 - GST_ELEMENT_ERROR(nuv, STREAM, FAILED,
1.2185 - (_("Internal data stream error.")),
1.2186 - ("streaming stopped, reason %s",
1.2187 - gst_flow_get_name(res)));
1.2188 + if (GST_FLOW_IS_FATAL(res)) {
1.2189 + GST_ELEMENT_ERROR(nuv, STREAM, FAILED,
1.2190 + (_("Internal data stream error.")),
1.2191 + ("streaming stopped, reason %s",
1.2192 + gst_flow_get_name(res)));
1.2193
1.2194 - gst_nuv_demux_send_eos(nuv);
1.2195 - }
1.2196 - return res;
1.2197 + gst_nuv_demux_send_eos(nuv);
1.2198 + }
1.2199 + return res;
1.2200 }
1.2201
1.2202 static void
1.2203 gst_nuv_demux_send_eos(GstNuvDemux * nuv)
1.2204 {
1.2205 - gst_element_post_message(GST_ELEMENT(nuv),
1.2206 - gst_message_new_segment_done(GST_OBJECT(nuv),
1.2207 - GST_FORMAT_TIME, -1));
1.2208 + gst_element_post_message(GST_ELEMENT(nuv),
1.2209 + gst_message_new_segment_done(GST_OBJECT(nuv),
1.2210 + GST_FORMAT_TIME,
1.2211 + -1));
1.2212
1.2213 - if (nuv->priv->src_video_pad)
1.2214 - gst_pad_push_event(nuv->priv->src_video_pad, gst_event_new_eos());
1.2215 - if (nuv->priv->src_audio_pad)
1.2216 - gst_pad_push_event(nuv->priv->src_audio_pad, gst_event_new_eos());
1.2217 + if (nuv->priv->src_video_pad)
1.2218 + gst_pad_push_event(nuv->priv->src_video_pad, gst_event_new_eos());
1.2219 + if (nuv->priv->src_audio_pad)
1.2220 + gst_pad_push_event(nuv->priv->src_audio_pad, gst_event_new_eos());
1.2221 }
1.2222
1.2223 -static GstFlowReturn
1.2224 +static GstFlowReturn
1.2225 gst_nuv_demux_read_bytes(GstNuvDemux * nuv, guint64 size, gboolean move,
1.2226 - GstBuffer ** buffer)
1.2227 + GstBuffer ** buffer)
1.2228 {
1.2229 - GstFlowReturn ret = GST_FLOW_OK;
1.2230 + GstFlowReturn ret = GST_FLOW_OK;
1.2231
1.2232 - if (size == 0)
1.2233 - {
1.2234 - return ret;
1.2235 - }
1.2236 + if (size == 0) {
1.2237 + return ret;
1.2238 + }
1.2239
1.2240 - if (nuv->priv->mode == NUV_PULL_MODE)
1.2241 - {
1.2242 - ret =
1.2243 - gst_pad_pull_range(nuv->priv->sinkpad, nuv->priv->offset, size,
1.2244 - buffer);
1.2245 - if (ret == GST_FLOW_OK)
1.2246 - {
1.2247 - if (move)
1.2248 - {
1.2249 - nuv->priv->offset += size;
1.2250 - }
1.2251 - /* got eos */
1.2252 - }
1.2253 - else if (ret == GST_FLOW_UNEXPECTED)
1.2254 - {
1.2255 - return GST_FLOW_ERROR_EOS;
1.2256 - }
1.2257 - }
1.2258 - else
1.2259 - {
1.2260 - if (gst_adapter_available(nuv->priv->adapter) < size)
1.2261 - {
1.2262 - nuv->priv->more_data = TRUE;
1.2263 - return GST_FLOW_ERROR_NO_DATA;
1.2264 - }
1.2265 - if (move)
1.2266 - {
1.2267 - *buffer = gst_adapter_take_buffer(nuv->priv->adapter, size);
1.2268 - }
1.2269 - else
1.2270 - {
1.2271 - guint8 *data = NULL;
1.2272 - data = (guint8 *) gst_adapter_peek(nuv->priv->adapter, size);
1.2273 - *buffer = gst_buffer_new();
1.2274 - gst_buffer_set_data(*buffer, data, size);
1.2275 - }
1.2276 - }
1.2277 - return ret;
1.2278 + if (nuv->priv->mode == NUV_PULL_MODE) {
1.2279 + ret =
1.2280 + gst_pad_pull_range(nuv->priv->sinkpad, nuv->priv->offset, size,
1.2281 + buffer);
1.2282 + if (ret == GST_FLOW_OK) {
1.2283 + if (move) {
1.2284 + nuv->priv->offset += size;
1.2285 + }
1.2286 + /*
1.2287 + * got eos
1.2288 + */
1.2289 + } else if (ret == GST_FLOW_UNEXPECTED) {
1.2290 + return GST_FLOW_ERROR_EOS;
1.2291 + }
1.2292 + } else {
1.2293 + if (gst_adapter_available(nuv->priv->adapter) < size) {
1.2294 + nuv->priv->more_data = TRUE;
1.2295 + return GST_FLOW_ERROR_NO_DATA;
1.2296 + }
1.2297 + if (move) {
1.2298 + *buffer = gst_adapter_take_buffer(nuv->priv->adapter, size);
1.2299 + } else {
1.2300 + guint8 *data = NULL;
1.2301 + data = (guint8 *) gst_adapter_peek(nuv->priv->adapter, size);
1.2302 + *buffer = gst_buffer_new();
1.2303 + gst_buffer_set_data(*buffer, data, size);
1.2304 + }
1.2305 + }
1.2306 + return ret;
1.2307 }
1.2308
1.2309 -static GstFlowReturn
1.2310 +static GstFlowReturn
1.2311 gst_nuv_demux_move_bytes(GstNuvDemux * nuv, guint64 size)
1.2312 {
1.2313 - GstFlowReturn ret = GST_FLOW_OK;
1.2314 + GstFlowReturn ret = GST_FLOW_OK;
1.2315
1.2316 - if (size == 0)
1.2317 - {
1.2318 - return ret;
1.2319 - }
1.2320 + if (size == 0) {
1.2321 + return ret;
1.2322 + }
1.2323
1.2324 - if (nuv->priv->mode == NUV_PULL_MODE)
1.2325 - {
1.2326 - nuv->priv->offset += size;
1.2327 - }
1.2328 - else
1.2329 - {
1.2330 - if (gst_adapter_available(nuv->priv->adapter) < size)
1.2331 - {
1.2332 - nuv->priv->more_data = TRUE;
1.2333 - return GST_FLOW_ERROR_NO_DATA;
1.2334 - }
1.2335 - gst_adapter_flush(nuv->priv->adapter, size);
1.2336 - }
1.2337 - return ret;
1.2338 + if (nuv->priv->mode == NUV_PULL_MODE) {
1.2339 + nuv->priv->offset += size;
1.2340 + } else {
1.2341 + if (gst_adapter_available(nuv->priv->adapter) < size) {
1.2342 + nuv->priv->more_data = TRUE;
1.2343 + return GST_FLOW_ERROR_NO_DATA;
1.2344 + }
1.2345 + gst_adapter_flush(nuv->priv->adapter, size);
1.2346 + }
1.2347 + return ret;
1.2348 }
1.2349
1.2350 -static gboolean
1.2351 +static gboolean
1.2352 gst_nuv_demux_sink_activate(GstPad * sinkpad)
1.2353 {
1.2354 - gboolean res = TRUE;
1.2355 - GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(sinkpad));
1.2356 + gboolean res = TRUE;
1.2357 + GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(sinkpad));
1.2358
1.2359 - if (gst_pad_check_pull_range(sinkpad))
1.2360 - {
1.2361 - gst_adapter_clear(nuv->priv->adapter);
1.2362 - res = gst_pad_activate_pull(sinkpad, TRUE);
1.2363 - }
1.2364 - else
1.2365 - {
1.2366 - gst_adapter_clear(nuv->priv->adapter);
1.2367 - res = gst_pad_activate_push(sinkpad, TRUE);
1.2368 - }
1.2369 + if (gst_pad_check_pull_range(sinkpad)) {
1.2370 + gst_adapter_clear(nuv->priv->adapter);
1.2371 + res = gst_pad_activate_pull(sinkpad, TRUE);
1.2372 + } else {
1.2373 + gst_adapter_clear(nuv->priv->adapter);
1.2374 + res = gst_pad_activate_push(sinkpad, TRUE);
1.2375 + }
1.2376
1.2377 - g_object_unref(nuv);
1.2378 - return res;
1.2379 + g_object_unref(nuv);
1.2380 + return res;
1.2381 }
1.2382
1.2383 -static gboolean
1.2384 +static gboolean
1.2385 gst_nuv_demux_sink_activate_pull(GstPad * sinkpad, gboolean active)
1.2386 {
1.2387 - GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(sinkpad));
1.2388 + GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(sinkpad));
1.2389
1.2390 - if (active)
1.2391 - {
1.2392 - GST_DEBUG_OBJECT(nuv, "activating pull function");
1.2393 - nuv->priv->mode = NUV_PULL_MODE;
1.2394 - gst_adapter_clear(nuv->priv->adapter);
1.2395 + if (active) {
1.2396 + GST_DEBUG_OBJECT(nuv, "activating pull function");
1.2397 + nuv->priv->mode = NUV_PULL_MODE;
1.2398 + gst_adapter_clear(nuv->priv->adapter);
1.2399
1.2400 - gst_pad_start_task(sinkpad, (GstTaskFunction) gst_nuv_demux_loop,
1.2401 - sinkpad);
1.2402 - }
1.2403 - else
1.2404 - {
1.2405 - GST_DEBUG_OBJECT(nuv, "deactivating pull function");
1.2406 - gst_pad_stop_task(sinkpad);
1.2407 - }
1.2408 - gst_object_unref(nuv);
1.2409 + gst_pad_start_task(sinkpad, (GstTaskFunction) gst_nuv_demux_loop,
1.2410 + sinkpad);
1.2411 + } else {
1.2412 + GST_DEBUG_OBJECT(nuv, "deactivating pull function");
1.2413 + gst_pad_stop_task(sinkpad);
1.2414 + }
1.2415 + gst_object_unref(nuv);
1.2416
1.2417 - return TRUE;
1.2418 + return TRUE;
1.2419 }
1.2420
1.2421 -static gboolean
1.2422 +static gboolean
1.2423 gst_nuv_demux_sink_activate_push(GstPad * pad, gboolean active)
1.2424 {
1.2425 - GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.2426 + GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.2427
1.2428 - if (active)
1.2429 - {
1.2430 - nuv->priv->mode = NUV_PUSH_MODE;
1.2431 - gst_adapter_clear(nuv->priv->adapter);
1.2432 + if (active) {
1.2433 + nuv->priv->mode = NUV_PUSH_MODE;
1.2434 + gst_adapter_clear(nuv->priv->adapter);
1.2435
1.2436 - GST_DEBUG_OBJECT(nuv, "activating push/chain function");
1.2437 - }
1.2438 - else
1.2439 - {
1.2440 - GST_DEBUG_OBJECT(nuv, "deactivating push/chain function");
1.2441 - }
1.2442 + GST_DEBUG_OBJECT(nuv, "activating push/chain function");
1.2443 + } else {
1.2444 + GST_DEBUG_OBJECT(nuv, "deactivating push/chain function");
1.2445 + }
1.2446
1.2447 - gst_object_unref(nuv);
1.2448 + gst_object_unref(nuv);
1.2449
1.2450 - return TRUE;
1.2451 + return TRUE;
1.2452 }
1.2453
1.2454 static frame_index_data *
1.2455 gst_nuv_demux_do_seek_index(GstNuvDemux * nuv, gint64 seek_pos,
1.2456 - gint64 segment_stop, GstFormat format)
1.2457 + gint64 segment_stop, GstFormat format)
1.2458 {
1.2459 - GSList *l;
1.2460 - frame_index_data *ret = NULL;
1.2461 + GSList *l;
1.2462 + frame_index_data *ret = NULL;
1.2463
1.2464 - if (nuv->priv->index == NULL)
1.2465 - {
1.2466 - return NULL;
1.2467 - }
1.2468 + if (nuv->priv->index == NULL) {
1.2469 + return NULL;
1.2470 + }
1.2471
1.2472 - /* find keyframe closest to the requested position */
1.2473 - for (l = nuv->priv->index; l != NULL; l = l->next)
1.2474 - {
1.2475 - frame_index_data *f = (frame_index_data *) l->data;
1.2476 - gint64 pos = 0;
1.2477 + /*
1.2478 + * find keyframe closest to the requested position
1.2479 + */
1.2480 + for (l = nuv->priv->index; l != NULL; l = l->next) {
1.2481 + frame_index_data *f = (frame_index_data *) l->data;
1.2482 + gint64 pos = 0;
1.2483
1.2484 - if (format == GST_FORMAT_BYTES)
1.2485 - {
1.2486 - pos = f->offset;
1.2487 - }
1.2488 - else if (format == GST_FORMAT_TIME)
1.2489 - {
1.2490 - pos = f->timecode;
1.2491 - }
1.2492 - else
1.2493 - {
1.2494 - return NULL;
1.2495 - }
1.2496 + if (format == GST_FORMAT_BYTES) {
1.2497 + pos = f->offset;
1.2498 + } else if (format == GST_FORMAT_TIME) {
1.2499 + pos = f->timecode;
1.2500 + } else {
1.2501 + return NULL;
1.2502 + }
1.2503
1.2504 - if (pos >= seek_pos)
1.2505 - {
1.2506 - ret = f;
1.2507 - break;
1.2508 - }
1.2509 + if (pos >= seek_pos) {
1.2510 + ret = f;
1.2511 + break;
1.2512 + }
1.2513
1.2514 - if ((segment_stop != -1) && (segment_stop != GST_CLOCK_TIME_NONE)
1.2515 - && (pos > segment_stop))
1.2516 - {
1.2517 - break;
1.2518 - }
1.2519 - }
1.2520 + if ((segment_stop != -1) && (segment_stop != GST_CLOCK_TIME_NONE)
1.2521 + && (pos > segment_stop)) {
1.2522 + break;
1.2523 + }
1.2524 + }
1.2525
1.2526 - return ret;
1.2527 + return ret;
1.2528 }
1.2529
1.2530 -static gboolean
1.2531 +static gboolean
1.2532 gst_nuv_demux_do_seek(GstNuvDemux * nuv, GstEvent * event)
1.2533 {
1.2534 - gdouble rate;
1.2535 - GstFormat format;
1.2536 - GstSeekFlags flags;
1.2537 - GstSeekType cur_type;
1.2538 - gint64 cur;
1.2539 - GstSeekType stop_type;
1.2540 - gint64 stop;
1.2541 - gboolean flush;
1.2542 - frame_index_data *entry;
1.2543 - gint64 segment_start;
1.2544 - gint64 segment_stop;
1.2545 - GstEvent *newsegment_event;
1.2546 + gdouble rate;
1.2547 + GstFormat format;
1.2548 + GstSeekFlags flags;
1.2549 + GstSeekType cur_type;
1.2550 + gint64 cur;
1.2551 + GstSeekType stop_type;
1.2552 + gint64 stop;
1.2553 + gboolean flush;
1.2554 + frame_index_data *entry;
1.2555 + gint64 segment_start;
1.2556 + gint64 segment_stop;
1.2557 + GstEvent *newsegment_event;
1.2558
1.2559 - if (nuv->priv->eos)
1.2560 - {
1.2561 - return FALSE;
1.2562 - }
1.2563 + if (nuv->priv->eos) {
1.2564 + return FALSE;
1.2565 + }
1.2566
1.2567 - if (nuv->priv->mode == NUV_PUSH_MODE)
1.2568 - {
1.2569 - return FALSE;
1.2570 - }
1.2571 + if (nuv->priv->mode == NUV_PUSH_MODE) {
1.2572 + return FALSE;
1.2573 + }
1.2574
1.2575
1.2576 - gst_event_parse_seek(event, &rate, &format, &flags,
1.2577 - &cur_type, &cur, &stop_type, &stop);
1.2578 + gst_event_parse_seek(event, &rate, &format, &flags,
1.2579 + &cur_type, &cur, &stop_type, &stop);
1.2580
1.2581
1.2582
1.2583 -/*
1.2584 - if (format == GST_FORMAT_TIME) {
1.2585 - GST_DEBUG_OBJECT (nuv, "Can only seek on BYTES");
1.2586 + /*
1.2587 + * if (format == GST_FORMAT_TIME) { GST_DEBUG_OBJECT (nuv, "Can only
1.2588 + * seek on BYTES"); return FALSE; }
1.2589 + */
1.2590 +
1.2591 + if (rate <= 0.0) {
1.2592 + GST_DEBUG_OBJECT(nuv, "Can only seek with positive rate");
1.2593 + return FALSE;
1.2594 + }
1.2595 +
1.2596 + if (cur_type == GST_SEEK_TYPE_SET) {
1.2597 + GST_OBJECT_LOCK(nuv);
1.2598 + if (gst_nuv_demux_do_seek_index(nuv, cur, -1, format) == NULL) {
1.2599 + GST_DEBUG_OBJECT(nuv, "No matching seek entry in index");
1.2600 + GST_OBJECT_UNLOCK(nuv);
1.2601 + return FALSE;
1.2602 + }
1.2603 + GST_OBJECT_UNLOCK(nuv);
1.2604 + }
1.2605 +
1.2606 + flush = !!(flags & GST_SEEK_FLAG_FLUSH);
1.2607 +
1.2608 + if (flush) {
1.2609 + gst_pad_push_event(nuv->priv->sinkpad,
1.2610 + gst_event_new_flush_start());
1.2611 + if (nuv->priv->src_video_pad != NULL) {
1.2612 + gst_pad_push_event(nuv->priv->src_video_pad,
1.2613 + gst_event_new_flush_start());
1.2614 + }
1.2615 +
1.2616 + if (nuv->priv->src_audio_pad != NULL) {
1.2617 + gst_pad_push_event(nuv->priv->src_audio_pad,
1.2618 + gst_event_new_flush_start());
1.2619 + }
1.2620 + } else {
1.2621 + gst_pad_pause_task(nuv->priv->sinkpad);
1.2622 + }
1.2623 +
1.2624 + GST_PAD_STREAM_LOCK(nuv->priv->sinkpad);
1.2625 + GST_OBJECT_LOCK(nuv);
1.2626 +
1.2627 +
1.2628 + if (cur == GST_CLOCK_TIME_NONE)
1.2629 + cur = 0;
1.2630 + if (stop == GST_CLOCK_TIME_NONE)
1.2631 + stop = nuv->priv->duration_time;
1.2632 +
1.2633 + if (cur_type == GST_SEEK_TYPE_SET)
1.2634 + segment_start = cur;
1.2635 + else if (cur_type == GST_SEEK_TYPE_CUR)
1.2636 + segment_start = nuv->priv->segment_start + cur;
1.2637 + else
1.2638 + segment_start = nuv->priv->segment_start;
1.2639 +
1.2640 + if (stop_type == GST_SEEK_TYPE_SET)
1.2641 + segment_stop = stop;
1.2642 + else if (stop_type == GST_SEEK_TYPE_CUR)
1.2643 + segment_stop = nuv->priv->segment_stop + stop;
1.2644 + else
1.2645 + segment_stop = nuv->priv->segment_stop;
1.2646 +
1.2647 + segment_start = CLAMP(segment_start, 0, nuv->priv->duration_time);
1.2648 + segment_stop = CLAMP(segment_stop, 0, nuv->priv->duration_time);
1.2649 +
1.2650 + entry = gst_nuv_demux_do_seek_index(nuv, segment_start,
1.2651 + segment_stop, format);
1.2652 +
1.2653 + if (entry == NULL) {
1.2654 + GST_DEBUG_OBJECT(nuv, "No matching seek entry in index");
1.2655 + goto seek_error;
1.2656 + }
1.2657 +
1.2658 + segment_start = entry->timecode;
1.2659 +
1.2660 + nuv->priv->segment_start = segment_start;
1.2661 + nuv->priv->segment_stop = segment_stop;
1.2662 +
1.2663 + GST_OBJECT_UNLOCK(nuv);
1.2664 +
1.2665 + if (!nuv->priv->eos) {
1.2666 + GstMessage *msg;
1.2667 + msg =
1.2668 + gst_message_new_segment_start(GST_OBJECT(nuv), GST_FORMAT_TIME,
1.2669 + nuv->priv->segment_start);
1.2670 +
1.2671 + gst_element_post_message(GST_ELEMENT(nuv), msg);
1.2672 + }
1.2673 +
1.2674 + GST_DEBUG_OBJECT(nuv,
1.2675 + "NEW SEGMENT START %" G_GUINT64_FORMAT ", STOP %"
1.2676 + G_GUINT64_FORMAT, segment_start, segment_stop);
1.2677 + newsegment_event =
1.2678 + gst_event_new_new_segment(FALSE, rate, GST_FORMAT_TIME,
1.2679 + segment_start, segment_stop,
1.2680 + segment_start);
1.2681 +
1.2682 +
1.2683 + if (flush) {
1.2684 + if (nuv->priv->src_video_pad != NULL) {
1.2685 + gst_pad_push_event(nuv->priv->src_video_pad,
1.2686 + gst_event_new_flush_stop());
1.2687 + }
1.2688 +
1.2689 + if (nuv->priv->src_audio_pad != NULL) {
1.2690 + gst_pad_push_event(nuv->priv->src_audio_pad,
1.2691 + gst_event_new_flush_stop());
1.2692 + }
1.2693 +
1.2694 + gst_pad_push_event(nuv->priv->sinkpad, gst_event_new_flush_stop());
1.2695 + }
1.2696 +
1.2697 +
1.2698 + if (nuv->priv->src_video_pad != NULL) {
1.2699 + gst_pad_push_event(nuv->priv->src_video_pad,
1.2700 + gst_event_ref(newsegment_event));
1.2701 + }
1.2702 + if (nuv->priv->src_audio_pad != NULL) {
1.2703 + gst_pad_push_event(nuv->priv->src_audio_pad,
1.2704 + gst_event_ref(newsegment_event));
1.2705 + }
1.2706 +
1.2707 + gst_event_unref(newsegment_event);
1.2708 +
1.2709 + nuv->priv->state = GST_NUV_DEMUX_FRAME_HEADER;
1.2710 + nuv->priv->offset = entry->offset;
1.2711 +
1.2712 + gst_pad_start_task(nuv->priv->sinkpad,
1.2713 + (GstTaskFunction) gst_nuv_demux_loop,
1.2714 + nuv->priv->sinkpad);
1.2715 +
1.2716 + GST_PAD_STREAM_UNLOCK(nuv->priv->sinkpad);
1.2717 + return TRUE;
1.2718 +
1.2719 + seek_error:
1.2720 + GST_DEBUG_OBJECT(nuv, "Got a seek error");
1.2721 + GST_OBJECT_UNLOCK(nuv);
1.2722 + GST_PAD_STREAM_UNLOCK(nuv->priv->sinkpad);
1.2723 return FALSE;
1.2724 - }
1.2725 -*/
1.2726 -
1.2727 - if (rate <= 0.0)
1.2728 - {
1.2729 - GST_DEBUG_OBJECT(nuv, "Can only seek with positive rate");
1.2730 - return FALSE;
1.2731 - }
1.2732 -
1.2733 - if (cur_type == GST_SEEK_TYPE_SET)
1.2734 - {
1.2735 - GST_OBJECT_LOCK(nuv);
1.2736 - if (gst_nuv_demux_do_seek_index(nuv, cur, -1, format) == NULL)
1.2737 - {
1.2738 - GST_DEBUG_OBJECT(nuv, "No matching seek entry in index");
1.2739 - GST_OBJECT_UNLOCK(nuv);
1.2740 - return FALSE;
1.2741 - }
1.2742 - GST_OBJECT_UNLOCK(nuv);
1.2743 - }
1.2744 -
1.2745 - flush = !!(flags & GST_SEEK_FLAG_FLUSH);
1.2746 -
1.2747 - if (flush)
1.2748 - {
1.2749 - gst_pad_push_event(nuv->priv->sinkpad, gst_event_new_flush_start());
1.2750 - if (nuv->priv->src_video_pad != NULL)
1.2751 - {
1.2752 - gst_pad_push_event(nuv->priv->src_video_pad,
1.2753 - gst_event_new_flush_start());
1.2754 - }
1.2755 -
1.2756 - if (nuv->priv->src_audio_pad != NULL)
1.2757 - {
1.2758 - gst_pad_push_event(nuv->priv->src_audio_pad,
1.2759 - gst_event_new_flush_start());
1.2760 - }
1.2761 - }
1.2762 - else
1.2763 - {
1.2764 - gst_pad_pause_task(nuv->priv->sinkpad);
1.2765 - }
1.2766 -
1.2767 - GST_PAD_STREAM_LOCK(nuv->priv->sinkpad);
1.2768 - GST_OBJECT_LOCK(nuv);
1.2769 -
1.2770 -
1.2771 - if (cur == GST_CLOCK_TIME_NONE)
1.2772 - cur = 0;
1.2773 - if (stop == GST_CLOCK_TIME_NONE)
1.2774 - stop = nuv->priv->duration_time;
1.2775 -
1.2776 - if (cur_type == GST_SEEK_TYPE_SET)
1.2777 - segment_start = cur;
1.2778 - else if (cur_type == GST_SEEK_TYPE_CUR)
1.2779 - segment_start = nuv->priv->segment_start + cur;
1.2780 - else
1.2781 - segment_start = nuv->priv->segment_start;
1.2782 -
1.2783 - if (stop_type == GST_SEEK_TYPE_SET)
1.2784 - segment_stop = stop;
1.2785 - else if (stop_type == GST_SEEK_TYPE_CUR)
1.2786 - segment_stop = nuv->priv->segment_stop + stop;
1.2787 - else
1.2788 - segment_stop = nuv->priv->segment_stop;
1.2789 -
1.2790 - segment_start = CLAMP(segment_start, 0, nuv->priv->duration_time);
1.2791 - segment_stop = CLAMP(segment_stop, 0, nuv->priv->duration_time);
1.2792 -
1.2793 - entry = gst_nuv_demux_do_seek_index(nuv, segment_start,
1.2794 - segment_stop, format);
1.2795 -
1.2796 - if (entry == NULL)
1.2797 - {
1.2798 - GST_DEBUG_OBJECT(nuv, "No matching seek entry in index");
1.2799 - goto seek_error;
1.2800 - }
1.2801 -
1.2802 - segment_start = entry->timecode;
1.2803 -
1.2804 - nuv->priv->segment_start = segment_start;
1.2805 - nuv->priv->segment_stop = segment_stop;
1.2806 -
1.2807 - GST_OBJECT_UNLOCK(nuv);
1.2808 -
1.2809 - if (!nuv->priv->eos)
1.2810 - {
1.2811 - GstMessage *msg;
1.2812 - msg = gst_message_new_segment_start(GST_OBJECT(nuv), GST_FORMAT_TIME,
1.2813 - nuv->priv->segment_start);
1.2814 -
1.2815 - gst_element_post_message(GST_ELEMENT(nuv), msg);
1.2816 - }
1.2817 -
1.2818 - GST_DEBUG_OBJECT(nuv,
1.2819 - "NEW SEGMENT START %" G_GUINT64_FORMAT ", STOP %"
1.2820 - G_GUINT64_FORMAT, segment_start, segment_stop);
1.2821 - newsegment_event =
1.2822 - gst_event_new_new_segment(FALSE, rate, GST_FORMAT_TIME, segment_start,
1.2823 - segment_stop, segment_start);
1.2824 -
1.2825 -
1.2826 - if (flush)
1.2827 - {
1.2828 - if (nuv->priv->src_video_pad != NULL)
1.2829 - {
1.2830 - gst_pad_push_event(nuv->priv->src_video_pad,
1.2831 - gst_event_new_flush_stop());
1.2832 - }
1.2833 -
1.2834 - if (nuv->priv->src_audio_pad != NULL)
1.2835 - {
1.2836 - gst_pad_push_event(nuv->priv->src_audio_pad,
1.2837 - gst_event_new_flush_stop());
1.2838 - }
1.2839 -
1.2840 - gst_pad_push_event(nuv->priv->sinkpad, gst_event_new_flush_stop());
1.2841 - }
1.2842 -
1.2843 -
1.2844 - if (nuv->priv->src_video_pad != NULL)
1.2845 - {
1.2846 - gst_pad_push_event(nuv->priv->src_video_pad,
1.2847 - gst_event_ref(newsegment_event));
1.2848 - }
1.2849 - if (nuv->priv->src_audio_pad != NULL)
1.2850 - {
1.2851 - gst_pad_push_event(nuv->priv->src_audio_pad,
1.2852 - gst_event_ref(newsegment_event));
1.2853 - }
1.2854 -
1.2855 - gst_event_unref(newsegment_event);
1.2856 -
1.2857 - nuv->priv->state = GST_NUV_DEMUX_FRAME_HEADER;
1.2858 - nuv->priv->offset = entry->offset;
1.2859 -
1.2860 - gst_pad_start_task(nuv->priv->sinkpad, (GstTaskFunction) gst_nuv_demux_loop,
1.2861 - nuv->priv->sinkpad);
1.2862 -
1.2863 - GST_PAD_STREAM_UNLOCK(nuv->priv->sinkpad);
1.2864 - return TRUE;
1.2865 -
1.2866 -seek_error:
1.2867 - GST_DEBUG_OBJECT(nuv, "Got a seek error");
1.2868 - GST_OBJECT_UNLOCK(nuv);
1.2869 - GST_PAD_STREAM_UNLOCK(nuv->priv->sinkpad);
1.2870 - return FALSE;
1.2871
1.2872 }
1.2873
1.2874 -static gboolean
1.2875 +static gboolean
1.2876 gst_nuv_demux_srcpad_event(GstPad * pad, GstEvent * event)
1.2877 {
1.2878 - gboolean res = FALSE;
1.2879 - GstNuvDemux *nuv;
1.2880 + gboolean res = FALSE;
1.2881 + GstNuvDemux *nuv;
1.2882
1.2883 - nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.2884 + nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.2885
1.2886 - switch (GST_EVENT_TYPE(event))
1.2887 - {
1.2888 - case GST_EVENT_SEEK:
1.2889 - res = gst_nuv_demux_do_seek(nuv, event);
1.2890 - break;
1.2891 - default:
1.2892 - res = FALSE;
1.2893 - break;
1.2894 - }
1.2895 + switch (GST_EVENT_TYPE(event)) {
1.2896 + case GST_EVENT_SEEK:
1.2897 + res = gst_nuv_demux_do_seek(nuv, event);
1.2898 + break;
1.2899 + default:
1.2900 + res = FALSE;
1.2901 + break;
1.2902 + }
1.2903
1.2904 - gst_object_unref(nuv);
1.2905 - return res;
1.2906 + gst_object_unref(nuv);
1.2907 + return res;
1.2908 }
1.2909
1.2910 -static gboolean
1.2911 +static gboolean
1.2912 gst_nuv_demux_sink_event(GstPad * pad, GstEvent * event)
1.2913 {
1.2914 - gboolean res = FALSE;
1.2915 - GstNuvDemux *nuv;
1.2916 + gboolean res = FALSE;
1.2917 + GstNuvDemux *nuv;
1.2918
1.2919 - nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.2920 + nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.2921
1.2922 - switch (GST_EVENT_TYPE(event))
1.2923 - {
1.2924 - case GST_EVENT_NEWSEGMENT:
1.2925 - {
1.2926 - gboolean update;
1.2927 - gdouble rate;
1.2928 - GstFormat format;
1.2929 - gint64 start;
1.2930 - gint64 stop;
1.2931 - gint64 position;
1.2932 + switch (GST_EVENT_TYPE(event)) {
1.2933 + case GST_EVENT_NEWSEGMENT:
1.2934 + {
1.2935 + gboolean update;
1.2936 + gdouble rate;
1.2937 + GstFormat format;
1.2938 + gint64 start;
1.2939 + gint64 stop;
1.2940 + gint64 position;
1.2941
1.2942 - gst_event_parse_new_segment(event, &update, &rate, &format, &start,
1.2943 - &stop, &position);
1.2944 - if ((format == GST_FORMAT_BYTES) && (start == 0))
1.2945 - {
1.2946 - g_debug("NEW SEGMENT 0");
1.2947 - if (nuv->priv->segment > 0)
1.2948 - {
1.2949 - nuv->priv->new_file = TRUE;
1.2950 - nuv->priv->state = GST_NUV_DEMUX_START;
1.2951 - nuv->priv->offset = 0;
1.2952 - }
1.2953 - nuv->priv->segment++;
1.2954 + gst_event_parse_new_segment(event, &update, &rate, &format,
1.2955 + &start, &stop, &position);
1.2956 + if ((format == GST_FORMAT_BYTES) && (start == 0)) {
1.2957 + g_debug("NEW SEGMENT 0");
1.2958 + if (nuv->priv->segment > 0) {
1.2959 + nuv->priv->new_file = TRUE;
1.2960 + nuv->priv->state = GST_NUV_DEMUX_START;
1.2961 + nuv->priv->offset = 0;
1.2962 + }
1.2963 + nuv->priv->segment++;
1.2964
1.2965 - /*
1.2966 - newsegment_event = gst_event_new_new_segment (FALSE, rate,
1.2967 - GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE, GST_CLOCK_TIME_NONE);
1.2968 + /*
1.2969 + * newsegment_event = gst_event_new_new_segment (FALSE,
1.2970 + * rate, GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE,
1.2971 + * GST_CLOCK_TIME_NONE);
1.2972 + *
1.2973 + * gst_pad_push_event (nuv->priv->src_audio_pad,
1.2974 + * gst_event_ref (newsegment_event)); gst_pad_push_event
1.2975 + * (nuv->priv->src_video_pad, gst_event_ref
1.2976 + * (newsegment_event)); gst_event_unref
1.2977 + * (newsegment_event);
1.2978 + */
1.2979 + res = gst_pad_event_default(pad, event);
1.2980 + }
1.2981 + break;
1.2982 + }
1.2983 + case GST_EVENT_CUSTOM_DOWNSTREAM:
1.2984 + {
1.2985 + /*
1.2986 + * nuv->priv->new_file = TRUE; nuv->priv->state =
1.2987 + * GST_NUV_DEMUX_START; nuv->priv->offset = 0;
1.2988 + */
1.2989 + GST_PAD_STREAM_LOCK(pad);
1.2990 + gst_nuv_demux_reset(nuv);
1.2991 + GST_PAD_STREAM_UNLOCK(pad);
1.2992
1.2993 - gst_pad_push_event (nuv->priv->src_audio_pad, gst_event_ref (newsegment_event));
1.2994 - gst_pad_push_event (nuv->priv->src_video_pad, gst_event_ref (newsegment_event));
1.2995 - gst_event_unref (newsegment_event);
1.2996 - */
1.2997 - res = gst_pad_event_default(pad, event);
1.2998 - }
1.2999 - break;
1.3000 - }
1.3001 - case GST_EVENT_CUSTOM_DOWNSTREAM:
1.3002 - {
1.3003 - /*
1.3004 - nuv->priv->new_file = TRUE;
1.3005 - nuv->priv->state = GST_NUV_DEMUX_START;
1.3006 - nuv->priv->offset = 0;
1.3007 - */
1.3008 - GST_PAD_STREAM_LOCK(pad);
1.3009 - gst_nuv_demux_reset(nuv);
1.3010 - GST_PAD_STREAM_UNLOCK(pad);
1.3011 + res = gst_pad_event_default(pad, event);
1.3012 + break;
1.3013 + }
1.3014 + default:
1.3015 + res = gst_pad_event_default(pad, event);
1.3016 + break;
1.3017 + }
1.3018
1.3019 - res = gst_pad_event_default(pad, event);
1.3020 - break;
1.3021 - }
1.3022 - default:
1.3023 - res = gst_pad_event_default(pad, event);
1.3024 - break;
1.3025 - }
1.3026 -
1.3027 - return res;
1.3028 + return res;
1.3029 }
1.3030
1.3031 -static GstFlowReturn
1.3032 +static GstFlowReturn
1.3033 gst_nuv_demux_chain(GstPad * pad, GstBuffer * buf)
1.3034 {
1.3035 - GstFlowReturn ret = GST_FLOW_OK;
1.3036 - GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.3037 + GstFlowReturn ret = GST_FLOW_OK;
1.3038 + GstNuvDemux *nuv = GST_NUV_DEMUX(gst_pad_get_parent(pad));
1.3039
1.3040 - if (nuv->priv->mode != NUV_PUSH_MODE)
1.3041 - return ret;
1.3042 + if (nuv->priv->mode != NUV_PUSH_MODE)
1.3043 + return ret;
1.3044
1.3045 - gst_adapter_push(nuv->priv->adapter, buf);
1.3046 + gst_adapter_push(nuv->priv->adapter, buf);
1.3047
1.3048 - while ((ret == GST_FLOW_OK) && (nuv->priv->more_data == FALSE))
1.3049 - {
1.3050 - ret = gst_nuv_demux_play(pad);
1.3051 - }
1.3052 + while ((ret == GST_FLOW_OK) && (nuv->priv->more_data == FALSE)) {
1.3053 + ret = gst_nuv_demux_play(pad);
1.3054 + }
1.3055
1.3056 - nuv->priv->more_data = FALSE;
1.3057 - gst_object_unref(nuv);
1.3058 + nuv->priv->more_data = FALSE;
1.3059 + gst_object_unref(nuv);
1.3060
1.3061 - return ret;
1.3062 + return ret;
1.3063 }
1.3064
1.3065 static void
1.3066 gst_nuv_demux_loop(GstPad * pad)
1.3067 {
1.3068 - gst_nuv_demux_play(pad);
1.3069 + gst_nuv_demux_play(pad);
1.3070 }
1.3071
1.3072 static void
1.3073 gst_nuv_demux_index_free(gpointer data, gpointer user_data)
1.3074 {
1.3075 - g_free(data);
1.3076 + g_free(data);
1.3077 }
1.3078
1.3079 static void
1.3080 gst_nuv_demux_reset(GstNuvDemux * nuv)
1.3081 {
1.3082 - nuv->priv->eos = FALSE;
1.3083 - nuv->priv->more_data = FALSE;
1.3084 - nuv->priv->state = GST_NUV_DEMUX_START;
1.3085 - nuv->priv->mode = NUV_PUSH_MODE;
1.3086 - nuv->priv->offset = 0;
1.3087 - nuv->priv->time_start = 0;
1.3088 - nuv->priv->time_qos = GST_CLOCK_TIME_NONE;
1.3089 - nuv->priv->duration_bytes = GST_CLOCK_TIME_NONE;
1.3090 - nuv->priv->duration_time = GST_CLOCK_TIME_NONE;
1.3091 - nuv->priv->last_video_return = GST_FLOW_OK;
1.3092 - nuv->priv->last_audio_return = GST_FLOW_OK;
1.3093 - nuv->priv->header_lengh = 0;
1.3094 - nuv->priv->segment_stop = GST_CLOCK_TIME_NONE;
1.3095 - nuv->priv->segment_start = GST_CLOCK_TIME_NONE;
1.3096 - nuv->priv->new_file = FALSE;
1.3097 + nuv->priv->eos = FALSE;
1.3098 + nuv->priv->more_data = FALSE;
1.3099 + nuv->priv->state = GST_NUV_DEMUX_START;
1.3100 + nuv->priv->mode = NUV_PUSH_MODE;
1.3101 + nuv->priv->offset = 0;
1.3102 + nuv->priv->time_start = 0;
1.3103 + nuv->priv->time_qos = GST_CLOCK_TIME_NONE;
1.3104 + nuv->priv->duration_bytes = GST_CLOCK_TIME_NONE;
1.3105 + nuv->priv->duration_time = GST_CLOCK_TIME_NONE;
1.3106 + nuv->priv->last_video_return = GST_FLOW_OK;
1.3107 + nuv->priv->last_audio_return = GST_FLOW_OK;
1.3108 + nuv->priv->header_lengh = 0;
1.3109 + nuv->priv->segment_stop = GST_CLOCK_TIME_NONE;
1.3110 + nuv->priv->segment_start = GST_CLOCK_TIME_NONE;
1.3111 + nuv->priv->new_file = FALSE;
1.3112
1.3113 - //clear index list
1.3114 - g_slist_foreach(nuv->priv->index, gst_nuv_demux_index_free, NULL);
1.3115 - g_slist_free(nuv->priv->index);
1.3116 - nuv->priv->index = NULL;
1.3117 + // clear index list
1.3118 + g_slist_foreach(nuv->priv->index, gst_nuv_demux_index_free, NULL);
1.3119 + g_slist_free(nuv->priv->index);
1.3120 + nuv->priv->index = NULL;
1.3121
1.3122 - gst_adapter_clear(nuv->priv->adapter);
1.3123 + gst_adapter_clear(nuv->priv->adapter);
1.3124
1.3125 - if (nuv->priv->mpeg_buffer != NULL)
1.3126 - {
1.3127 - gst_buffer_unref(nuv->priv->mpeg_buffer);
1.3128 - nuv->priv->mpeg_buffer = NULL;
1.3129 - }
1.3130 + if (nuv->priv->mpeg_buffer != NULL) {
1.3131 + gst_buffer_unref(nuv->priv->mpeg_buffer);
1.3132 + nuv->priv->mpeg_buffer = NULL;
1.3133 + }
1.3134 }
1.3135
1.3136 static void
1.3137 gst_nuv_demux_destoy_src_pad(GstNuvDemux * nuv)
1.3138 {
1.3139 - if (nuv->priv->src_video_pad)
1.3140 - {
1.3141 - gst_element_remove_pad(GST_ELEMENT(nuv), nuv->priv->src_video_pad);
1.3142 - nuv->priv->src_video_pad = NULL;
1.3143 - }
1.3144 + if (nuv->priv->src_video_pad) {
1.3145 + gst_element_remove_pad(GST_ELEMENT(nuv), nuv->priv->src_video_pad);
1.3146 + nuv->priv->src_video_pad = NULL;
1.3147 + }
1.3148
1.3149 - if (nuv->priv->src_audio_pad)
1.3150 - {
1.3151 - gst_element_remove_pad(GST_ELEMENT(nuv), nuv->priv->src_audio_pad);
1.3152 - nuv->priv->src_audio_pad = NULL;
1.3153 - }
1.3154 + if (nuv->priv->src_audio_pad) {
1.3155 + gst_element_remove_pad(GST_ELEMENT(nuv), nuv->priv->src_audio_pad);
1.3156 + nuv->priv->src_audio_pad = NULL;
1.3157 + }
1.3158 }
1.3159
1.3160 -static GstStateChangeReturn
1.3161 +static GstStateChangeReturn
1.3162 gst_nuv_demux_change_state(GstElement * element, GstStateChange transition)
1.3163 {
1.3164 - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
1.3165 + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
1.3166
1.3167 - g_debug("Nuvdemux state_change");
1.3168 - switch (transition)
1.3169 - {
1.3170 - case GST_STATE_CHANGE_NULL_TO_READY:
1.3171 - gst_nuv_demux_reset(GST_NUV_DEMUX(element));
1.3172 - gst_nuv_demux_destoy_src_pad(GST_NUV_DEMUX(element));
1.3173 - break;
1.3174 - default:
1.3175 - break;
1.3176 - }
1.3177 + g_debug("Nuvdemux state_change");
1.3178 + switch (transition) {
1.3179 + case GST_STATE_CHANGE_NULL_TO_READY:
1.3180 + gst_nuv_demux_reset(GST_NUV_DEMUX(element));
1.3181 + gst_nuv_demux_destoy_src_pad(GST_NUV_DEMUX(element));
1.3182 + break;
1.3183 + default:
1.3184 + break;
1.3185 + }
1.3186
1.3187 - g_debug("Nuvdemux state_change: 1");
1.3188 + g_debug("Nuvdemux state_change: 1");
1.3189
1.3190 - ret = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
1.3191 - if (ret == GST_STATE_CHANGE_FAILURE)
1.3192 - {
1.3193 - goto done;
1.3194 - }
1.3195 + ret =
1.3196 + GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
1.3197 + if (ret == GST_STATE_CHANGE_FAILURE) {
1.3198 + goto done;
1.3199 + }
1.3200
1.3201
1.3202 - g_debug("Nuvdemux state_change: 2");
1.3203 + g_debug("Nuvdemux state_change: 2");
1.3204
1.3205 - switch (transition)
1.3206 - {
1.3207 - case GST_STATE_CHANGE_READY_TO_NULL:
1.3208 - gst_nuv_demux_reset(GST_NUV_DEMUX(element));
1.3209 - gst_nuv_demux_destoy_src_pad(GST_NUV_DEMUX(element));
1.3210 - break;
1.3211 - default:
1.3212 - break;
1.3213 - }
1.3214 + switch (transition) {
1.3215 + case GST_STATE_CHANGE_READY_TO_NULL:
1.3216 + gst_nuv_demux_reset(GST_NUV_DEMUX(element));
1.3217 + gst_nuv_demux_destoy_src_pad(GST_NUV_DEMUX(element));
1.3218 + break;
1.3219 + default:
1.3220 + break;
1.3221 + }
1.3222
1.3223
1.3224 - g_debug("Nuvdemux state_change: DONE");
1.3225 + g_debug("Nuvdemux state_change: DONE");
1.3226
1.3227 -done:
1.3228 - return ret;
1.3229 + done:
1.3230 + return ret;
1.3231 }
1.3232
1.3233 #if (GST_VERSION_MINOR == 10) && (GST_VERSION_MICRO < 6)
1.3234 -GstBuffer *
1.3235 +GstBuffer *
1.3236 gst_adapter_take_buffer(GstAdapter * adapter, guint nbytes)
1.3237 {
1.3238 - GstBuffer *buffer;
1.3239 - GstBuffer *cur;
1.3240 - guint8 *data;
1.3241 + GstBuffer *buffer;
1.3242 + GstBuffer *cur;
1.3243 + guint8 *data;
1.3244
1.3245 - g_return_val_if_fail(GST_IS_ADAPTER(adapter), NULL);
1.3246 - g_return_val_if_fail(nbytes > 0, NULL);
1.3247 + g_return_val_if_fail(GST_IS_ADAPTER(adapter), NULL);
1.3248 + g_return_val_if_fail(nbytes > 0, NULL);
1.3249
1.3250 - GST_LOG_OBJECT(adapter, "taking buffer of %u bytes", nbytes);
1.3251 + GST_LOG_OBJECT(adapter, "taking buffer of %u bytes", nbytes);
1.3252
1.3253 - /* we don't have enough data, return NULL. This is unlikely
1.3254 - * as one usually does an _available() first instead of peeking a
1.3255 - * random size. */
1.3256 - if (G_UNLIKELY(nbytes > adapter->size))
1.3257 - return NULL;
1.3258 + /*
1.3259 + * we don't have enough data, return NULL. This is unlikely as one
1.3260 + * usually does an _available() first instead of peeking a random
1.3261 + * size.
1.3262 + */
1.3263 + if (G_UNLIKELY(nbytes > adapter->size))
1.3264 + return NULL;
1.3265
1.3266 - /* our head buffer has enough data left, return it */
1.3267 - cur = adapter->buflist->data;
1.3268 - if (GST_BUFFER_SIZE(cur) >= nbytes + adapter->skip)
1.3269 - {
1.3270 - GST_LOG_OBJECT(adapter, "providing buffer of %d bytes via sub-buffer",
1.3271 - nbytes);
1.3272 - buffer = gst_buffer_create_sub(cur, adapter->skip, nbytes);
1.3273 + /*
1.3274 + * our head buffer has enough data left, return it
1.3275 + */
1.3276 + cur = adapter->buflist->data;
1.3277 + if (GST_BUFFER_SIZE(cur) >= nbytes + adapter->skip) {
1.3278 + GST_LOG_OBJECT(adapter,
1.3279 + "providing buffer of %d bytes via sub-buffer",
1.3280 + nbytes);
1.3281 + buffer = gst_buffer_create_sub(cur, adapter->skip, nbytes);
1.3282
1.3283 - gst_adapter_flush(adapter, nbytes);
1.3284 + gst_adapter_flush(adapter, nbytes);
1.3285
1.3286 - return buffer;
1.3287 - }
1.3288 + return buffer;
1.3289 + }
1.3290
1.3291 - data = gst_adapter_take(adapter, nbytes);
1.3292 - if (data == NULL)
1.3293 - return NULL;
1.3294 + data = gst_adapter_take(adapter, nbytes);
1.3295 + if (data == NULL)
1.3296 + return NULL;
1.3297
1.3298 - buffer = gst_buffer_new();
1.3299 - GST_BUFFER_DATA(buffer) = data;
1.3300 - GST_BUFFER_MALLOCDATA(buffer) = data;
1.3301 - GST_BUFFER_SIZE(buffer) = nbytes;
1.3302 + buffer = gst_buffer_new();
1.3303 + GST_BUFFER_DATA(buffer) = data;
1.3304 + GST_BUFFER_MALLOCDATA(buffer) = data;
1.3305 + GST_BUFFER_SIZE(buffer) = nbytes;
1.3306
1.3307 - return buffer;
1.3308 + return buffer;
1.3309 }
1.3310 #endif
1.3311
1.3312 static void
1.3313 gst_nuv_typefind(GstTypeFind * tf, gpointer unused)
1.3314 {
1.3315 - guint8 *data = gst_type_find_peek(tf, 0, 11);
1.3316 + guint8 *data = gst_type_find_peek(tf, 0, 11);
1.3317
1.3318 - if (data)
1.3319 - {
1.3320 - if (memcmp(data, "MythTVVideo", 11) == 0
1.3321 - || memcmp(data, "NuppelVideo", 11) == 0)
1.3322 - {
1.3323 - gst_type_find_suggest(tf, GST_TYPE_FIND_MAXIMUM,
1.3324 - gst_caps_new_simple("video/x-nuv", NULL));
1.3325 - }
1.3326 - }
1.3327 + if (data) {
1.3328 + if (memcmp(data, "MythTVVideo", 11) == 0
1.3329 + || memcmp(data, "NuppelVideo", 11) == 0) {
1.3330 + gst_type_find_suggest(tf, GST_TYPE_FIND_MAXIMUM,
1.3331 + gst_caps_new_simple("video/x-nuv",
1.3332 + NULL));
1.3333 + }
1.3334 + }
1.3335 }
1.3336
1.3337 -static gboolean
1.3338 +static gboolean
1.3339 plugin_init(GstPlugin * plugin)
1.3340 {
1.3341 - static gchar *exts[] = { "nuv", NULL };
1.3342 + static gchar *exts[] = { "nuv", NULL };
1.3343 #ifdef ENABLE_NLS
1.3344 - setlocale(LC_ALL, "");
1.3345 - bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
1.3346 -#endif /* ENABLE_NLS */
1.3347 + setlocale(LC_ALL, "");
1.3348 + bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
1.3349 +#endif /* ENABLE_NLS */
1.3350
1.3351 - if (!gst_element_register(plugin, "nuvdemux", GST_RANK_SECONDARY,
1.3352 - GST_TYPE_NUV_DEMUX))
1.3353 - {
1.3354 - return FALSE;
1.3355 - }
1.3356 + if (!gst_element_register(plugin, "nuvdemux", GST_RANK_SECONDARY,
1.3357 + GST_TYPE_NUV_DEMUX)) {
1.3358 + return FALSE;
1.3359 + }
1.3360
1.3361 - if (!gst_type_find_register(plugin, "video/x-nuv", GST_RANK_SECONDARY,
1.3362 - gst_nuv_typefind,
1.3363 - exts,
1.3364 - gst_caps_new_simple("video/x-nuv", NULL), NULL,
1.3365 - NULL))
1.3366 - {
1.3367 - GST_WARNING("can't register typefind");
1.3368 - return FALSE;
1.3369 - }
1.3370 + if (!gst_type_find_register(plugin, "video/x-nuv", GST_RANK_SECONDARY,
1.3371 + gst_nuv_typefind,
1.3372 + exts,
1.3373 + gst_caps_new_simple("video/x-nuv", NULL),
1.3374 + NULL, NULL)) {
1.3375 + GST_WARNING("can't register typefind");
1.3376 + return FALSE;
1.3377 + }
1.3378
1.3379 - return TRUE;
1.3380 + return TRUE;
1.3381 }
1.3382
1.3383 GST_PLUGIN_DEFINE(GST_VERSION_MAJOR,
1.3384 - GST_VERSION_MINOR,
1.3385 - "nuvdemux",
1.3386 - "Demuxes and muxes audio and video",
1.3387 - plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME,
1.3388 - GST_PACKAGE_ORIGIN)
1.3389 + GST_VERSION_MINOR,
1.3390 + "nuvdemux",
1.3391 + "Demuxes and muxes audio and video",
1.3392 + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME,
1.3393 + GST_PACKAGE_ORIGIN)