Commit 12e856c2 authored by Ronald S. Bultje's avatar Ronald S. Bultje

Riff, EBML, fourcc etc. work. Not fully finished, but better than what we used...

Riff, EBML, fourcc etc. work. Not fully finished, but better than what we used to have and definately worth a first b...

Original commit message from CVS:
Riff, EBML, fourcc etc. work. Not fully finished, but better than
what we used to have and definately worth a first broad testing.

I've revived rifflib. Rifflib used to be a bytestream-for-riff, which
just dup'ed bytestream. I've rewritten rifflib to be a modern riff-
chunk parser that uses bytestream fully, plus adds some extra functions
so that riff file parsing becomes extremely easy. It also contains some
small usability functions for strh/strf and metadata parsing. Note that
it doesn't use the new tagging yet, that's a TODO.

Avidemux has been rewritten to use this. I think we all agreed that
avidemux was pretty much a big mess, which is because it used all
sort of bytestream magic all around the place. It was just ugly.
This is a lot nicer, very complete and safe. I think this is far more
robust than what the old avidemux could ever have been. Of course, it
might contain bugs, please let me know.

EBML writing has also been implemented. This is useful for matroska.
I'm intending to modify avidemux (with a riffwriter) similarly. Maybe
I'll change wavparse/-enc too to use rifflib.

Lastly, several plugins have been modified to use rifflib's fourcc
parsing instead of their own. this puts fourcc parsing in one central
place, which should make it a lot simpler to add new fourccs. We might
want to move this to its own lib instead of rifflib.

Enjoy!
parent 396a5c81
plugin_LTLIBRARIES = libgstavi.la
libgstavi_la_SOURCES = gstavidemux.c gstavimux.c
libgstavi_la_SOURCES = \
gstavi.c \
gstavidemux.c \
gstavimux.c
noinst_HEADERS = \
gstavimux.h \
gstavidemux.h
avi-ids.h \
gstavimux.h \
gstavidemux.h
libgstavi_la_CFLAGS = $(GST_CFLAGS)
libgstavi_la_LIBADD =
......
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_AVI_H__
#define __GST_AVI_H__
#include <gst/gst.h>
typedef struct _gst_riff_avih {
guint32 us_frame; /* microsec per frame */
guint32 max_bps; /* byte/s overall */
guint32 pad_gran; /* pad_granularity */
guint32 flags;
/* flags values */
#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */
#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */
#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */
#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */
#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */
guint32 tot_frames; /* # of frames (all) */
guint32 init_frames; /* initial frames (???) */
guint32 streams;
guint32 bufsize; /* suggested buffer size */
guint32 width;
guint32 height;
guint32 scale;
guint32 rate;
guint32 start;
guint32 length;
} gst_riff_avih;
#endif /* __GST_AVI_H__ */
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@temple-baptist.com>
*
* gstavi.c: plugin registering
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstavidemux.h"
#include "gstavimux.h"
static gboolean
plugin_init (GstPlugin *plugin)
{
if (!gst_library_load ("riff"))
return FALSE;
return (gst_element_register (plugin, "avidemux",
GST_RANK_PRIMARY,
GST_TYPE_AVI_DEMUX) &&
gst_element_register (plugin, "avimux",
GST_RANK_NONE,
GST_TYPE_AVIMUX));
}
GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"avi",
"AVI stream handling",
plugin_init,
VERSION,
"LGPL",
GST_PACKAGE,
GST_ORIGIN
)
This diff is collapsed.
......@@ -17,30 +17,26 @@
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_AVI_DEMUX_H__
#define __GST_AVI_DEMUX_H__
#include <gst/gst.h>
#include <gst/bytestream/bytestream.h>
#include <gst/riff/riff.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "gst/riff/riff-ids.h"
#include "gst/riff/riff-read.h"
G_BEGIN_DECLS
#define GST_TYPE_AVI_DEMUX \
(gst_avi_demux_get_type())
(gst_avi_demux_get_type ())
#define GST_AVI_DEMUX(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVI_DEMUX,GstAviDemux))
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux))
#define GST_AVI_DEMUX_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVI_DEMUX,GstAviDemux))
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemux))
#define GST_IS_AVI_DEMUX(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVI_DEMUX))
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX))
#define GST_IS_AVI_DEMUX_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVI_DEMUX))
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX))
#define GST_AVI_DEMUX_MAX_STREAMS 16
......@@ -48,85 +44,85 @@ extern "C" {
((((chunkid) & 0xff) - '0') * 10 + \
(((chunkid) >> 8) & 0xff) - '0')
typedef struct _GstAviDemux GstAviDemux;
typedef struct _GstAviDemuxClass GstAviDemuxClass;
typedef struct
{
gint index_nr;
gint stream_nr;
guint64 ts;
guint32 flags;
guint32 offset;
gint size;
guint64 bytes_before;
guint32 frames_before;
typedef struct {
gint index_nr;
gint stream_nr;
guint64 ts;
guint32 flags;
guint32 offset;
gint size;
guint64 bytes_before;
guint32 frames_before;
} gst_avi_index_entry;
typedef struct
{
GstPad *pad;
gint num;
gst_riff_strh strh;
guint32 current_frame;
guint32 current_byte;
guint64 delay;
gboolean need_flush;
guint64 end_pos;
typedef struct {
/* index of this streamcontext */
guint num;
/* pad, strh */
GstPad *pad;
gst_riff_strh *strh;
guint64 total_bytes;
guint32 total_frames;
/* current position (byte, frame, time) */
guint current_frame;
guint64 current_byte;
gint current_entry;
guint32 skip;
/* delay in time (init_frames) */
guint64 delay;
/* stream length */
guint64 total_bytes;
guint32 total_frames;
guint32 skip;
} avi_stream_context;
typedef enum
{
typedef enum {
GST_AVI_DEMUX_START,
GST_AVI_DEMUX_HEADER,
GST_AVI_DEMUX_MOVI,
} GstAviDemuxState;
struct _GstAviDemux {
GstElement element;
typedef struct _GstAviDemux {
GstRiffRead parent;
/* pads */
GstPad *sinkpad, *srcpad;
GstPad *sinkpad;
/* AVI decoding state */
guint32 fcc_type;
GstAviDemuxState state;
guint level_up;
GstByteStream *bs;
/* index */
gst_avi_index_entry *index_entries;
gulong index_size;
gulong index_offset;
gst_riff_avih avih;
guint index_size;
guint64 index_offset;
/* streams */
guint num_streams;
guint num_v_streams;
guint num_a_streams;
avi_stream_context stream[GST_AVI_DEMUX_MAX_STREAMS];
gboolean seek_pending;
gint64 seek_offset;
guint64 last_seek;
/* some stream info for length */
guint32 us_per_frame;
guint32 num_frames;
GstCaps *metadata, *streaminfo;
};
/* seeking */
guint64 seek_offset;
guint64 last_seek;
struct _GstAviDemuxClass {
GstElementClass parent_class;
};
/* info */
GstCaps *streaminfo;
} GstAviDemux;
GType gst_avi_demux_get_type (void);
typedef struct _GstAviDemuxClass {
GstRiffReadClass parent_class;
} GstAviDemuxClass;
#ifdef __cplusplus
}
#endif /* __cplusplus */
GType gst_avi_demux_get_type (void);
G_END_DECLS
#endif /* __GST_AVI_DEMUX_H__ */
......@@ -23,7 +23,8 @@
#include <gst/gst.h>
#include <gst/riff/riff.h>
#include <gst/riff/riff-ids.h>
#include "avi-ids.h"
#ifdef __cplusplus
......
......@@ -2,14 +2,18 @@ plugin_LTLIBRARIES = libgstmatroska.la
libgstmatroska_la_SOURCES = \
ebml-read.c \
ebml-write.c \
matroska.c \
matroska-demux.c
matroska-demux.c \
matroska-mux.c
noinst_HEADERS = \
ebml-ids.h \
ebml-read.h \
ebml-write.h \
matroska-demux.h \
matroska-ids.h
matroska-ids.h \
matroska-mux.h
libgstmatroska_la_CFLAGS = $(GST_CFLAGS)
libgstmatroska_la_LIBADD =
......
......@@ -157,7 +157,20 @@ gst_ebml_read_element_id (GstEbmlRead *ebml,
guint32 total;
if (gst_bytestream_peek_bytes (ebml->bs, &data, 1) != 1) {
/*gst_element_error (GST_ELEMENT (ebml), "Read error");*/
GstEvent *event = NULL;
guint32 remaining;
/* Here, we might encounter EOS */
gst_bytestream_get_status (ebml->bs, &remaining, &event);
if (event && GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
gst_pad_event_default (ebml->sinkpad, event);
} else {
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_event_unref (event);
gst_element_error (GST_ELEMENT (ebml),
"Read error at position %llu (0x%llx)",
pos, pos);
}
return -1;
}
total = data[0];
......@@ -166,13 +179,18 @@ gst_ebml_read_element_id (GstEbmlRead *ebml,
len_mask >>= 1;
}
if (read > 4) {
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_element_error (GST_ELEMENT (ebml),
"Invalid EBML ID size tag (0x%x)", data[0]);
"Invalid EBML ID size tag (0x%x) at position %llu (0x%llx)",
data[0], pos, pos);
return -1;
}
if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) {
/*gst_element_error (GST_ELEMENT (ebml), "Read error");*/
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_element_error (GST_ELEMENT (ebml),
"Read error at position %llu (0x%llx)",
pos, pos);
return -1;
}
while (n < read)
......@@ -201,7 +219,10 @@ gst_ebml_read_element_length (GstEbmlRead *ebml,
guint64 total;
if (gst_bytestream_peek_bytes (ebml->bs, &data, 1) != 1) {
/*gst_element_error (GST_ELEMENT (ebml), "Read error");*/
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_element_error (GST_ELEMENT (ebml),
"Read error at position %llu (0x%llx)",
pos, pos);
return -1;
}
total = data[0];
......@@ -210,15 +231,20 @@ gst_ebml_read_element_length (GstEbmlRead *ebml,
len_mask >>= 1;
}
if (read > 8) {
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_element_error (GST_ELEMENT (ebml),
"Invalid EBML length size tag (0x%x)", data[0]);
"Invalid EBML length size tag (0x%x) at position %llu (0x%llx)",
data[0], pos, pos);
return -1;
}
if ((total &= (len_mask - 1)) == len_mask - 1)
num_ffs++;
if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) {
/*gst_element_error (GST_ELEMENT (ebml), "Read error");*/
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_element_error (GST_ELEMENT (ebml),
"Read error at position %llu (0x%llx)",
pos, pos);
return -1;
}
while (n < read) {
......@@ -228,12 +254,6 @@ gst_ebml_read_element_length (GstEbmlRead *ebml,
n++;
}
if (!total) {
gst_element_error (GST_ELEMENT (ebml),
"Invalid length 0");
return -1;
}
if (read == num_ffs)
*length = G_MAXUINT64;
else
......@@ -254,7 +274,10 @@ gst_ebml_read_element_data (GstEbmlRead *ebml,
GstBuffer *buf = NULL;
if (gst_bytestream_peek (ebml->bs, &buf, length) != length) {
/*gst_element_error (GST_ELEMENT (ebml), "Read error");*/
guint64 pos = gst_bytestream_tell (ebml->bs);
gst_element_error (GST_ELEMENT (ebml),
"Read error at position %llu (0x%llx)",
pos, pos);
if (buf)
gst_buffer_unref (buf);
return NULL;
......@@ -276,16 +299,12 @@ gst_ebml_peek_id (GstEbmlRead *ebml,
guint *level_up)
{
guint32 id;
guint my_level_up;
g_return_val_if_fail (level_up != NULL, 0);
g_assert (level_up);
if (gst_ebml_read_element_id (ebml, &id, &my_level_up) < 0)
if (gst_ebml_read_element_id (ebml, &id, level_up) < 0)
return 0;
if (level_up)
*level_up = my_level_up;
return id;
}
......@@ -293,11 +312,47 @@ gst_ebml_peek_id (GstEbmlRead *ebml,
* Seek to a given offset.
*/
void
GstEvent *
gst_ebml_read_seek (GstEbmlRead *ebml,
guint64 offset)
{
gst_bytestream_seek (ebml->bs, offset, GST_SEEK_METHOD_SET);
guint32 remaining;
GstEvent *event;
guchar *data;
/* first, flush remaining buffers */
gst_bytestream_get_status (ebml->bs, &remaining, &event);
if (event) {
g_warning ("Unexpected event before seek");
gst_event_unref (event);
}
if (remaining)
gst_bytestream_flush_fast (ebml->bs, remaining);
/* now seek */
if (!gst_bytestream_seek (ebml->bs, offset, GST_SEEK_METHOD_SET)) {
gst_element_error (GST_ELEMENT (ebml),
"Seek to position %llu (0x%llx) failed",
offset, offset);
return NULL;
}
/* and now, peek a new byte. This will fail because there's a
* pending event. Then, take the event and return it. */
if (gst_bytestream_peek_bytes (ebml->bs, &data, 1))
g_warning ("Unexpected data after seek");
/* get the discont event and return */
gst_bytestream_get_status (ebml->bs, &remaining, &event);
if (!event || GST_EVENT_TYPE (event) != GST_EVENT_DISCONTINUOUS) {
gst_element_error (GST_ELEMENT (ebml),
"No discontinuity event after seek");
if (event)
gst_event_unref (event);
return NULL;
}
return event;
}
/*
......@@ -308,8 +363,9 @@ gboolean
gst_ebml_read_skip (GstEbmlRead *ebml)
{
gint bytes;
guint32 id;
guint32 id, remaining;
guint64 length;
GstEvent *event;
if ((bytes = gst_ebml_read_element_id (ebml, &id, NULL)) < 0)
return FALSE;
......@@ -319,7 +375,23 @@ gst_ebml_read_skip (GstEbmlRead *ebml)
return FALSE;
gst_bytestream_flush_fast (ebml->bs, bytes);
return gst_bytestream_flush (ebml->bs, length);
/* do we have enough bytes left to skip? */
gst_bytestream_get_status (ebml->bs, &remaining, &event);
if (event) {
g_warning ("Unexpected event before skip");
gst_event_unref (event);
}
if (remaining >= length)
return gst_bytestream_flush (ebml->bs, length);
if (!(event = gst_ebml_read_seek (ebml,
gst_bytestream_tell (ebml->bs) + length)))
return FALSE;
gst_event_unref (event);
return TRUE;
}
/*
......@@ -365,7 +437,8 @@ gst_ebml_read_uint (GstEbmlRead *ebml,
size = GST_BUFFER_SIZE (buf);
if (size < 1 || size > 8) {
gst_element_error (GST_ELEMENT (ebml),
"Invalid integer element size %d", size);
"Invalid integer element size %d at position %llu (0x%llu)",
size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf));
gst_buffer_unref (buf);
return FALSE;
}
......@@ -400,7 +473,8 @@ gst_ebml_read_sint (GstEbmlRead *ebml,
size = GST_BUFFER_SIZE (buf);
if (size < 1 || size > 8) {
gst_element_error (GST_ELEMENT (ebml),
"Invalid integer element size %d", size);
"Invalid integer element size %d at position %llu (0x%llx)",
size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf));
gst_buffer_unref (buf);
return FALSE;
}
......@@ -439,7 +513,8 @@ gst_ebml_read_float (GstEbmlRead *ebml,
if (size != 4 && size != 8 && size != 10) {
gst_element_error (GST_ELEMENT (ebml),
"Invalid float element size %d", size);
"Invalid float element size %d at position %llu (0x%llx)",
size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf));
gst_buffer_unref (buf);
return FALSE;
}
......
......@@ -63,7 +63,7 @@ GType gst_ebml_read_get_type (void);
guint32 gst_ebml_peek_id (GstEbmlRead *ebml,
guint *level_up);
void gst_ebml_read_seek (GstEbmlRead *ebml,
GstEvent *gst_ebml_read_seek (GstEbmlRead *ebml,
guint64 offset);
gboolean gst_ebml_read_skip (GstEbmlRead *ebml);
gboolean gst_ebml_read_buffer (GstEbmlRead *ebml,
......@@ -91,7 +91,7 @@ gboolean gst_ebml_read_master (GstEbmlRead *ebml,
guint32 *id);
gboolean gst_ebml_read_binary (GstEbmlRead *ebml,
guint32 *id,
guchar **binary,
guint8 **binary,
guint64 *length);
gboolean gst_ebml_read_header (GstEbmlRead *read,
gchar **doctype,
......
This diff is collapsed.
/* GStreamer EBML I/O
* (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
*
* ebml-write.c: write EBML data to file/stream
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_EBML_WRITE_H__
#define __GST_EBML_WRITE_H__
#include <glib.h>
#include <gst/gst.h>
G_BEGIN_DECLS
#define GST_TYPE_EBML_WRITE \
(gst_ebml_write_get_type ())
#define GST_EBML_WRITE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EBML_WRITE, GstEbmlWrite))
#define GST_EBML_WRITE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_EBML_WRITE, GstEbmlWriteClass))
#define GST_IS_EBML_WRITE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EBML_WRITE))
#define GST_IS_EBML_WRITE_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_WRITE))
#define GST_EBML_WRITE_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_WRITE, GstEbmlWriteClass))
typedef struct _GstEbmlWrite {
GstElement parent;
GstPad *srcpad;
guint64 pos;
GstBuffer *cache;
guint handled;
} GstEbmlWrite;
typedef struct _GstEbmlWriteClass {
GstElementClass parent;
} GstEbmlWriteClass;
GType gst_ebml_write_get_type (void);
/*
* Caching means that we do not push one buffer for
* each element, but fill this one until a flush.
*/
void gst_ebml_write_set_cache (GstEbmlWrite *ebml,
guint size);
void gst_ebml_write_flush_cache (GstEbmlWrite *ebml);
/*
* Seeking.
*/
void gst_ebml_write_seek (GstEbmlWrite *ebml,
guint64 pos);
/*
* Data writing.
*/
void gst_ebml_write_uint (GstEbmlWrite *ebml,
guint32 id,
guint64 num);
void gst_ebml_write_sint (GstEbmlWrite *ebml,
guint32 id,
gint64 num);
void gst_ebml_write_float (GstEbmlWrite *ebml,
guint32 id,
gdouble num);
void gst_ebml_write_ascii (GstEbmlWrite *ebml,
guint32 id,
const gchar *str);
void gst_ebml_write_utf8 (GstEbmlWrite *ebml,
guint32 id,
const gchar *str);
void gst_ebml_write_date (GstEbmlWrite *ebml,
guint32 id,
gint64 date);
guint64 gst_ebml_write_master_start (GstEbmlWrite *ebml,
guint32 id);
void gst_ebml_write_master_finish (GstEbmlWrite *ebml,
guint64 startpos);
void gst_ebml_write_binary (GstEbmlWrite *ebml,
guint32 id,
guchar *binary,
guint64 length);
void gst_ebml_write_header (GstEbmlWrite *ebml,
gchar *doctype,
guint version);
/*
* Note: this is supposed to be used only for media data.
*/
void gst_ebml_write_buffer_header (GstEbmlWrite *ebml,
guint32 id,
guint64 length);
void gst_ebml_write_buffer (GstEbmlWrite *ebml,
GstBuffer *data);
/*
* A hack, basically... See matroska-mux.c. I should actually
* make a nice _replace_element_with_size() or so, but this
* works for now.
*/
void gst_ebml_replace_uint (GstEbmlWrite *ebml,
guint64 pos,
guint64 num);
G_END_DECLS
#endif /* __GST_EBML_WRITE_H__ */
......@@ -25,7 +25,7 @@
#include "ebml-ids.h"
/*
* EBML element IDs. max. 32-bit.
* Matroska element IDs. max. 32-bit.
*/
/* toplevel segment */
......@@ -141,7 +141,7 @@
#define GST_MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG2 "A_AAC/MPEG2/"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG4 "A_AAC/MPEG4/"
/* TODO: AC3-9/10, Real, Musepack, Quicktime */
/* TODO: AC3-9/10 (?), Real, Musepack, Quicktime */
/*
* Enumerations for various types (mapping from binary
......
This diff is collapsed.
/* GStreamer Matroska muxer/demuxer
* (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
*
* matroska-mux.h: matroska file/stream muxer object types
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of