Commit 812834b6 authored by conrad's avatar conrad

add basic support for (experimental) Ogg mapping for CELT codec.

This patch adds CELT header parsing and granulepos interpretation to
liboggz, so that CELT can be used with oggzdump, oggzmerge, oggz-validate
etc., and reports samplerate and channels in oggzinfo.
NB. This also expands the public OggzStreamContent enum to include
OGGZ_CONTENT_CELT


git-svn-id: http://svn.annodex.net/liboggz/trunk@3449 8158c8cd-e7e1-0310-9fa4-c5954c97daef
parent 9d093787
......@@ -110,6 +110,7 @@ typedef enum OggzStreamContent {
OGGZ_CONTENT_FLAC0,
OGGZ_CONTENT_FLAC,
OGGZ_CONTENT_ANXDATA,
OGGZ_CONTENT_CELT,
OGGZ_CONTENT_UNKNOWN
} OggzStreamContent;
......
......@@ -272,6 +272,28 @@ auto_oggpcm2 (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data)
return 1;
}
static int
auto_celt (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data)
{
unsigned char * header = op->packet;
ogg_int64_t granule_rate = 0;
int numheaders;
if (op->bytes < 56) return 0;
granule_rate = (ogg_int64_t) INT32_LE_AT(&header[40]);
#ifdef DEBUG
printf ("Got celt sample rate %d\n", (int)granule_rate);
#endif
oggz_set_granulerate (oggz, serialno, granule_rate, OGGZ_AUTO_MULT);
numheaders = (ogg_int64_t) INT32_LE_AT(&header[52]) + 2;
oggz_stream_set_numheaders (oggz, serialno, numheaders);
return 1;
}
static int
auto_cmml (OGGZ * oggz, ogg_packet * op, long serialno, void * user_data)
{
......@@ -931,6 +953,7 @@ const oggz_auto_contenttype_t oggz_auto_codec_ident[] = {
{"fLaC", 4, "Flac0", auto_flac0, auto_calc_flac, NULL},
{"\177FLAC", 4, "Flac", auto_flac, auto_calc_flac, NULL},
{"AnxData", 7, "AnxData", auto_anxdata, NULL, NULL},
{"CELT ", 8, "CELT", auto_celt, NULL, NULL},
{"", 0, "Unknown", NULL, NULL, NULL}
};
......
......@@ -388,6 +388,46 @@ This was the Theora header for theora-alpha2:
*/
/*
* CELT (experimental)
* last updated 20080213
*
* Default field type: LITTLE ENDIAN unsigned integer
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1| Byte
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| codec_id: Identifier char[8]: 'CELT ' | 0-3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | 4-7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| codec_version: char[20] | 8-11
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | 12-15
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | 16-19
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | 20-23
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | 24-27
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| version_id | 28-31
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| header_size | 32-35
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| mode | 36-39
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sample_rate | 40-43
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| nb_channels | 44-47
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| bytes_per_packet | 48-51
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| extra_headers | 52-55
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
int oggz_auto_identify (OGGZ *oggz, ogg_page *og, long serialno);
#endif /* __OGGZ_AUTO_H__ */
......@@ -175,6 +175,22 @@ ot_speex_info (unsigned char * data, long len)
return buf;
}
static char *
ot_celt_info (unsigned char * data, long len)
{
char * buf;
if (len < 56) return NULL;
buf = malloc (60);
snprintf (buf, 60,
"\tAudio-Samplerate: %d Hz\n\tAudio-Channels: %d\n",
INT32_LE_AT(&data[40]), INT32_LE_AT(&data[44]));
return buf;
}
static char *
ot_flac_info (unsigned char * data, long len)
{
......@@ -266,6 +282,7 @@ static const OTCodecInfoFunc codec_ident[] = {
NULL, /* FLAC0 */
ot_flac_info, /* FLAC */
NULL, /* ANXDATA */
ot_celt_info, /* CELT */
NULL /* UNKOWN */
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment