gst_plugins_good/gst/avi/gstavimux.h
author hgs
Wed, 24 Mar 2010 18:04:17 -0500
changeset 16 8e837d1bf446
permissions -rw-r--r--
201009
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/* AVI muxer plugin for GStreamer
hgs
parents:
diff changeset
     2
 * Copyright (C) 2002 Ronald Bultje <rbultje@ronald.bitfreak.net>
hgs
parents:
diff changeset
     3
 *
hgs
parents:
diff changeset
     4
 * This library is free software; you can redistribute it and/or
hgs
parents:
diff changeset
     5
 * modify it under the terms of the GNU Library General Public
hgs
parents:
diff changeset
     6
 * License as published by the Free Software Foundation; either
hgs
parents:
diff changeset
     7
 * version 2 of the License, or (at your option) any later version.
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * This library is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
hgs
parents:
diff changeset
    12
 * Library General Public License for more details.
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * You should have received a copy of the GNU Library General Public
hgs
parents:
diff changeset
    15
 * License along with this library; if not, write to the
hgs
parents:
diff changeset
    16
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
hgs
parents:
diff changeset
    17
 * Boston, MA 02111-1307, USA.
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#ifndef __GST_AVI_MUX_H__
hgs
parents:
diff changeset
    22
#define __GST_AVI_MUX_H__
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <gst/gst.h>
hgs
parents:
diff changeset
    26
#include <gst/base/gstcollectpads.h>
hgs
parents:
diff changeset
    27
#include <gst/riff/riff-ids.h>
hgs
parents:
diff changeset
    28
#include "avi-ids.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
G_BEGIN_DECLS
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#define GST_TYPE_AVI_MUX \
hgs
parents:
diff changeset
    33
  (gst_avi_mux_get_type())
hgs
parents:
diff changeset
    34
#define GST_AVI_MUX(obj) \
hgs
parents:
diff changeset
    35
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVI_MUX,GstAviMux))
hgs
parents:
diff changeset
    36
#define GST_AVI_MUX_CLASS(klass) \
hgs
parents:
diff changeset
    37
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVI_MUX,GstAviMuxClass))
hgs
parents:
diff changeset
    38
#define GST_IS_AVI_MUX(obj) \
hgs
parents:
diff changeset
    39
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVI_MUX))
hgs
parents:
diff changeset
    40
#define GST_IS_AVI_MUX_CLASS(klass) \
hgs
parents:
diff changeset
    41
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVI_MUX))
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
#define GST_AVI_INDEX_OF_INDEXES     0
hgs
parents:
diff changeset
    44
#define GST_AVI_INDEX_OF_CHUNKS      1
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
/* this allows indexing up to 64GB avi file */
hgs
parents:
diff changeset
    47
#define GST_AVI_SUPERINDEX_COUNT    32
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
typedef struct _gst_avi_superindex_entry {
hgs
parents:
diff changeset
    50
  guint64 offset;
hgs
parents:
diff changeset
    51
  guint32 size;
hgs
parents:
diff changeset
    52
  guint32 duration;
hgs
parents:
diff changeset
    53
} gst_avi_superindex_entry;
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
typedef struct _gst_riff_strh_full {
hgs
parents:
diff changeset
    56
  gst_riff_strh  parent;
hgs
parents:
diff changeset
    57
  /* rcFrame, RECT structure (struct of 4 shorts) */
hgs
parents:
diff changeset
    58
  gint16  left;
hgs
parents:
diff changeset
    59
  gint16  top;
hgs
parents:
diff changeset
    60
  gint16  right;
hgs
parents:
diff changeset
    61
  gint16  bottom;
hgs
parents:
diff changeset
    62
} gst_riff_strh_full;
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
typedef struct _GstAviPad {
hgs
parents:
diff changeset
    65
  /* do not extend, link to it */
hgs
parents:
diff changeset
    66
  /* is NULL if original sink request pad has been removed */
hgs
parents:
diff changeset
    67
  GstCollectData *collect;
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
  /* type */
hgs
parents:
diff changeset
    70
  gboolean is_video;
hgs
parents:
diff changeset
    71
  gboolean connected;
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
  /* chunk tag */
hgs
parents:
diff changeset
    74
  gchar *tag;
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
  /* stream header */
hgs
parents:
diff changeset
    77
  gst_riff_strh hdr;
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
  /* odml super indexes */
hgs
parents:
diff changeset
    80
  gst_avi_superindex_entry idx[GST_AVI_SUPERINDEX_COUNT];
hgs
parents:
diff changeset
    81
  gint idx_index;
hgs
parents:
diff changeset
    82
  gchar *idx_tag;
hgs
parents:
diff changeset
    83
} GstAviPad;
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
typedef struct _GstAviVideoPad {
hgs
parents:
diff changeset
    86
  GstAviPad parent;
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
  /* stream format */
hgs
parents:
diff changeset
    89
  gst_riff_strf_vids vids;
hgs
parents:
diff changeset
    90
  /* extra data */
hgs
parents:
diff changeset
    91
  GstBuffer *vids_codec_data;
hgs
parents:
diff changeset
    92
  /* ODML video properties */
hgs
parents:
diff changeset
    93
  gst_riff_vprp vprp;
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
} GstAviVideoPad;
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
typedef struct _GstAviAudioPad {
hgs
parents:
diff changeset
    98
  GstAviPad parent;
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
  /* stream format */
hgs
parents:
diff changeset
   101
  gst_riff_strf_auds auds;
hgs
parents:
diff changeset
   102
  /* audio info for bps calculation */
hgs
parents:
diff changeset
   103
  guint32 audio_size;
hgs
parents:
diff changeset
   104
  guint64 audio_time;
hgs
parents:
diff changeset
   105
  /* extra data */
hgs
parents:
diff changeset
   106
  GstBuffer *auds_codec_data;
hgs
parents:
diff changeset
   107
} GstAviAudioPad;
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
typedef struct _GstAviCollectData {
hgs
parents:
diff changeset
   110
  /* extend the CollectData */
hgs
parents:
diff changeset
   111
  GstCollectData collect;
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
  GstAviPad      *avipad;
hgs
parents:
diff changeset
   114
} GstAviCollectData;
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
typedef struct _GstAviMux GstAviMux;
hgs
parents:
diff changeset
   117
typedef struct _GstAviMuxClass GstAviMuxClass;
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
struct _GstAviMux {
hgs
parents:
diff changeset
   120
  GstElement element;
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
  /* pads */
hgs
parents:
diff changeset
   123
  GstPad              *srcpad;
hgs
parents:
diff changeset
   124
  /* sinkpads, video first */
hgs
parents:
diff changeset
   125
  GSList              *sinkpads;
hgs
parents:
diff changeset
   126
  /* video restricted to 1 pad */
hgs
parents:
diff changeset
   127
  guint               video_pads, audio_pads;
hgs
parents:
diff changeset
   128
  GstCollectPads      *collect;
hgs
parents:
diff changeset
   129
  GstPadEventFunction  collect_event;
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
  /* the AVI header */
hgs
parents:
diff changeset
   132
  /* still some single stream video data in mux struct */
hgs
parents:
diff changeset
   133
  gst_riff_avih avi_hdr;
hgs
parents:
diff changeset
   134
  /* total number of (video) frames */
hgs
parents:
diff changeset
   135
  guint32 total_frames;
hgs
parents:
diff changeset
   136
  /* amount of total data (bytes) */
hgs
parents:
diff changeset
   137
  guint64 total_data;
hgs
parents:
diff changeset
   138
  /* amount of data (bytes) in the AVI/AVIX block;
hgs
parents:
diff changeset
   139
   * actually the movi list, so counted from and including the movi tag */
hgs
parents:
diff changeset
   140
  guint32 data_size, datax_size;
hgs
parents:
diff changeset
   141
  /* num (video) frames in the AVI/AVIX block */
hgs
parents:
diff changeset
   142
  guint32 num_frames, numx_frames;
hgs
parents:
diff changeset
   143
  /* size of hdrl list, including tag as usual */
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
  /* total size of extra codec data */
hgs
parents:
diff changeset
   146
  guint32 codec_data_size;
hgs
parents:
diff changeset
   147
  /* state info */
hgs
parents:
diff changeset
   148
  gboolean write_header;
hgs
parents:
diff changeset
   149
  gboolean restart;
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
  /* tags */
hgs
parents:
diff changeset
   152
  GstTagList *tags_snap;
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
  /* information about the AVI index ('idx') */
hgs
parents:
diff changeset
   155
  gst_riff_index_entry *idx;
hgs
parents:
diff changeset
   156
  gint idx_index, idx_count;
hgs
parents:
diff changeset
   157
  /* offset of *chunk* (relative to a base offset); entered in the index */
hgs
parents:
diff changeset
   158
  guint32 idx_offset;
hgs
parents:
diff changeset
   159
  /* size of idx1 chunk (including! chunk header and size bytes) */
hgs
parents:
diff changeset
   160
  guint32 idx_size;
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
  /* are we a big file already? */
hgs
parents:
diff changeset
   163
  gboolean is_bigfile;
hgs
parents:
diff changeset
   164
  guint64 avix_start;
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
  /* whether to use "large AVI files" or just stick to small indexed files */
hgs
parents:
diff changeset
   167
  gboolean enable_large_avi;
hgs
parents:
diff changeset
   168
};
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
struct _GstAviMuxClass {
hgs
parents:
diff changeset
   171
  GstElementClass parent_class;
hgs
parents:
diff changeset
   172
};
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
GType gst_avi_mux_get_type(void);
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
G_END_DECLS
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
#endif /* __GST_AVI_MUX_H__ */