gst-plugins-nuvdemux/nuvdemux/gstnuvdemux.h
author rosfran
Thu Nov 16 21:30:58 2006 +0000 (2006-11-16)
branchtrunk
changeset 89 edcd63c2ac77
parent 85 7f6ea4639cb9
child 91 6b1e210c250a
permissions -rw-r--r--
[svn r90] Fixes to the read on "FileTransfer".
melunko@47
     1
/* GStreamer
melunko@47
     2
 * Copyright (C) <2006> Renato Araujo Oliveira Filho <renato.filho@indt.org.br>
melunko@47
     3
 *                      Rosfran Borges <rosfran.borges@indt.org.br>
melunko@47
     4
 *
melunko@47
     5
 * This library is free software; you can redistribute it and/or
melunko@47
     6
 * modify it under the terms of the GNU Library General Public
melunko@47
     7
 * License as published by the Free Software Foundation; either
melunko@47
     8
 * version 2 of the License, or (at your option) any later version.
melunko@47
     9
 *
melunko@47
    10
 * This library is distributed in the hope that it will be useful,
melunko@47
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
melunko@47
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
melunko@47
    13
 * Library General Public License for more details.
melunko@47
    14
 *
melunko@47
    15
 * You should have received a copy of the GNU Library General Public
melunko@47
    16
 * License along with this library; if not, write to the
melunko@47
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
melunko@47
    18
 * Boston, MA 02111-1307, USA.
melunko@47
    19
 */
melunko@47
    20
melunko@47
    21
#ifndef __GST_NUV_DEMUX_H__
melunko@47
    22
#define __GST_NUV_DEMUX_H__
melunko@47
    23
melunko@47
    24
#include <gst/gst.h>
melunko@47
    25
melunko@47
    26
#include <gst/base/gstadapter.h>
melunko@47
    27
melunko@47
    28
G_BEGIN_DECLS
melunko@47
    29
melunko@47
    30
#define GST_TYPE_NUV_DEMUX \
melunko@47
    31
  (gst_nuv_demux_get_type ())
melunko@47
    32
#define GST_NUV_DEMUX(obj) \
melunko@47
    33
  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_NUV_DEMUX, GstNuvDemux))
melunko@47
    34
#define GST_NUV_DEMUX_CLASS(klass) \
melunko@47
    35
  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_NUV_DEMUX, GstNuvDemuxClass))
melunko@47
    36
#define GST_IS_NUV_DEMUX(obj) \
melunko@47
    37
  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_NUV_DEMUX))
melunko@47
    38
#define GST_IS_NUV_DEMUX_CLASS(klass) \
melunko@47
    39
  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_NUV_DEMUX))
melunko@47
    40
rosfran@73
    41
#define DEMUX_INDEX_SIZE_MAX (100000)
rosfran@73
    42
rosfran@56
    43
/* Indexes (timecodes/offsets) conversion structures */
rosfran@56
    44
typedef struct
rosfran@56
    45
{
rosfran@56
    46
    gint64 i_time;
rosfran@56
    47
    gint64 i_offset;
rosfran@56
    48
rosfran@56
    49
} nuv_demux_index_entry;
rosfran@56
    50
rosfran@56
    51
typedef struct
rosfran@56
    52
{
rosfran@56
    53
    gint i_idx;
rosfran@56
    54
    gint i_idx_max;
rosfran@56
    55
rosfran@73
    56
    nuv_demux_index_entry idx[DEMUX_INDEX_SIZE_MAX];
rosfran@56
    57
} nuv_demux_index;
melunko@47
    58
melunko@47
    59
/* */
melunko@47
    60
typedef struct
melunko@47
    61
{
melunko@47
    62
    gchar id[12];       /* "NuppelVideo\0" or "MythTVVideo\0" */
melunko@47
    63
    gchar version[5];    /* "x.xx\0" */
melunko@47
    64
melunko@47
    65
    gint  i_width;
melunko@47
    66
    gint  i_height;
melunko@47
    67
    gint  i_width_desired;
melunko@47
    68
    gint  i_height_desired;
melunko@47
    69
melunko@47
    70
    gchar i_mode;            /* P progressive, I interlaced */
melunko@47
    71
melunko@47
    72
    gdouble  d_aspect;       /* 1.0 squared pixel */
melunko@47
    73
    gdouble  d_fps;
renatofilho@85
    74
    //fps num/denom
renatofilho@85
    75
    gint     i_fpsn;
renatofilho@85
    76
    gint     i_fpsd;
melunko@47
    77
melunko@47
    78
    gint     i_video_blocks; /* 0 no video, -1 unknown */
melunko@47
    79
    gint     i_audio_blocks;
melunko@47
    80
    gint     i_text_blocks;
melunko@47
    81
melunko@47
    82
    gint     i_keyframe_distance;
melunko@47
    83
melunko@47
    84
} nuv_header;
melunko@47
    85
melunko@47
    86
typedef struct
melunko@47
    87
{
melunko@47
    88
    gchar i_type;        /* A: audio, V: video, S: sync; T: test
melunko@47
    89
                           R: Seekpoint (string:RTjjjjjjjj)
melunko@47
    90
                           D: Extra data for codec */
melunko@47
    91
    gchar i_compression; /* V: 0 uncompressed
melunko@47
    92
                              1 RTJpeg
melunko@47
    93
                              2 RTJpeg+lzo
melunko@47
    94
                              N black frame
melunko@47
    95
                              L copy last
melunko@47
    96
                           A: 0 uncompressed (44100 1-bits, 2ch)
melunko@47
    97
                              1 lzo
melunko@47
    98
                              2 layer 2
melunko@47
    99
                              3 layer 3
melunko@47
   100
                              F flac
melunko@47
   101
                              S shorten
melunko@47
   102
                              N null frame loudless
melunko@47
   103
                              L copy last
melunko@47
   104
                            S: B audio and vdeo sync point
melunko@47
   105
                               A audio sync info (timecode == effective
melunko@47
   106
                                    dsp frequency*100)
melunko@47
   107
                               V next video sync (timecode == next video
melunko@47
   108
                                    frame num)
melunko@47
   109
                               S audio,video,text correlation */
melunko@47
   110
    gchar i_keyframe;    /* 0 keyframe, else no no key frame */
melunko@47
   111
    guint8 i_filters;  /* 0x01: gauss 5 pixel (8,2,2,2,2)/16
melunko@47
   112
                           0x02: gauss 5 pixel (8,1,1,1,1)/12
melunko@47
   113
                           0x04: cartoon filter */
melunko@47
   114
rosfran@73
   115
    gint32 i_timecode;     /* ms */
melunko@47
   116
rosfran@56
   117
    gint i_length;       /* V,A,T: length of following data
melunko@47
   118
                           S: length of packet correl */
melunko@47
   119
} nuv_frame_header;
melunko@47
   120
melunko@47
   121
/* FIXME Not sure of this one */
melunko@47
   122
typedef struct
melunko@47
   123
{
melunko@47
   124
    gint             i_version;
melunko@47
   125
    guint32		     i_video_fcc;
melunko@47
   126
melunko@47
   127
    guint32		     i_audio_fcc;
melunko@47
   128
    gint             i_audio_sample_rate;
melunko@47
   129
    gint             i_audio_bits_per_sample;
melunko@47
   130
    gint             i_audio_channels;
melunko@47
   131
    gint             i_audio_compression_ratio;
melunko@47
   132
    gint             i_audio_quality;
melunko@47
   133
    gint             i_rtjpeg_quality;
melunko@47
   134
    gint             i_rtjpeg_luma_filter;
melunko@47
   135
    gint             i_rtjpeg_chroma_filter;
melunko@47
   136
    gint             i_lavc_bitrate;
melunko@47
   137
    gint             i_lavc_qmin;
melunko@47
   138
    gint             i_lavc_qmax;
melunko@47
   139
    gint             i_lavc_maxqdiff;
melunko@47
   140
    gint64         	 i_seekable_offset;
melunko@47
   141
    gint64           i_keyframe_adjust_offset;
melunko@47
   142
melunko@47
   143
} nuv_extended_header;
melunko@47
   144
melunko@47
   145
typedef enum {
melunko@47
   146
  GST_NUV_DEMUX_START,
melunko@47
   147
  GST_NUV_DEMUX_HEADER_DATA,
melunko@47
   148
  GST_NUV_DEMUX_EXTRA_DATA,
melunko@47
   149
  GST_NUV_DEMUX_MPEG_DATA,
melunko@47
   150
  GST_NUV_DEMUX_EXTEND_HEADER,
melunko@47
   151
  GST_NUV_DEMUX_EXTEND_HEADER_DATA,
melunko@47
   152
  GST_NUV_DEMUX_FRAME_HEADER,
melunko@47
   153
  GST_NUV_DEMUX_MOVI,
melunko@47
   154
  GST_NUV_DEMUX_INVALID_DATA
melunko@47
   155
} GstNuvDemuxState;
melunko@47
   156
melunko@47
   157
typedef struct _GstNuvDemux {
melunko@47
   158
  GstElement     parent;
melunko@47
   159
melunko@47
   160
  guint         mode;
melunko@47
   161
  GstAdapter    *adapter; 
melunko@47
   162
melunko@47
   163
  /* pads */
melunko@47
   164
  GstPad        *sinkpad;
melunko@47
   165
  GstPad        *src_video_pad;  
melunko@47
   166
  GstPad        *src_audio_pad;
melunko@47
   167
renatofilho@88
   168
  GstFlowReturn last_video_return;
renatofilho@88
   169
  GstFlowReturn last_audio_return;
renatofilho@88
   170
melunko@47
   171
  /* NUV decoding state */
renatofilho@84
   172
  GstNuvDemuxState  state;
renatofilho@85
   173
  guint64           duration;
renatofilho@84
   174
  guint64           offset;
renatofilho@85
   175
  guint64           time_offset;
renatofilho@85
   176
  guint64           last_frame_time;
renatofilho@84
   177
  gboolean          new_audio_segment;
renatofilho@84
   178
  gboolean          new_video_segment;
renatofilho@77
   179
melunko@47
   180
  /* Mpeg ExtraData */
melunko@47
   181
  guint64       mpeg_data_size;
melunko@47
   182
  GstBuffer     *mpeg_buffer;
melunko@47
   183
  
melunko@47
   184
  nuv_header *h;
melunko@47
   185
  nuv_extended_header *eh;
melunko@47
   186
  nuv_frame_header *fh;
rosfran@56
   187
  
leo_sobral@80
   188
  /* FIXME: change these fields to private struct */
leo_sobral@80
   189
  /* first data buffer received, should sent new_segment */
melunko@47
   190
} GstNuvDemux;
melunko@47
   191
melunko@47
   192
typedef struct _GstNuvDemuxClass {
melunko@47
   193
  GstElementClass parent_class;
melunko@47
   194
} GstNuvDemuxClass;
melunko@47
   195
melunko@47
   196
GType           gst_nuv_demux_get_type          (void);
melunko@47
   197
melunko@47
   198
G_END_DECLS
melunko@47
   199
melunko@47
   200
#endif /* __GST_NUV_DEMUX_H__ */