summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-04-04 22:34:26 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-04-04 22:34:26 +0000
commite52788d06952635c8c4e6f8c510cf311847aa641 (patch)
treed26cabfca65b43fd9f9df87b84024bf96da88053 /libavformat
parentae3fa4ea9cf8126c1c56b9c621bb9c60f5d809a9 (diff)
info packet read/write & simplify
Originally committed as revision 2965 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/nut.c163
1 files changed, 106 insertions, 57 deletions
diff --git a/libavformat/nut.c b/libavformat/nut.c
index a049365b8c..ca80ad3e70 100644
--- a/libavformat/nut.c
+++ b/libavformat/nut.c
@@ -28,7 +28,7 @@
* - checksumming
* - seeking
* - index writing
- * - info and index packet reading support
+ * - index packet reading support
* - startcode searching for broken streams
*/
@@ -94,6 +94,26 @@ typedef struct {
StreamContext *stream;
} NUTContext;
+static char *info_table[][2]={
+ {NULL , NULL }, // end
+ {NULL , NULL },
+ {NULL , "UTF8"},
+ {NULL , "v"},
+ {NULL , "s"},
+ {"StreamId" , "v"},
+ {"SegmentId" , "v"},
+ {"StartTimestamp" , "v"},
+ {"EndTimestamp" , "v"},
+ {"Author" , "UTF8"},
+ {"Titel" , "UTF8"},
+ {"Description" , "UTF8"},
+ {"Copyright" , "UTF8"},
+ {"Encoder" , "UTF8"},
+ {"Keyword" , "UTF8"},
+ {"Cover" , "JPEG"},
+ {"Cover" , "PNG"},
+};
+
static void update_lru(int *lru, int current, int count){
int i;
@@ -245,30 +265,23 @@ static uint64_t get_v(ByteIOContext *bc)
return -1;
}
-static int get_b(ByteIOContext *bc, char *data, int maxlen)
-{
- int i, len;
+static int get_str(ByteIOContext *bc, char *string, int maxlen){
+ int len= get_v(bc);
- len = get_v(bc);
- for (i = 0; i < len && i < maxlen; i++)
- data[i] = get_byte(bc);
- /* skip remaining bytes */
- url_fskip(bc, len-i);
-
- return 0;
-}
+ if(len && maxlen)
+ get_buffer(bc, string, FFMIN(len, maxlen));
+ while(len > maxlen){
+ get_byte(bc);
+ len--;
+ }
-static int get_bi(ByteIOContext *bc)
-{
- int i, len, val = 0;
+ if(maxlen)
+ string[FFMIN(len, maxlen-1)]= 0;
- len = get_v(bc);
- for (i = 0; i < len && i <= 4; i++)
- val |= get_byte(bc) << (i * 8);
- /* skip remaining bytes */
- url_fskip(bc, len-i);
-
- return val;
+ if(maxlen == len)
+ return -1;
+ else
+ return 0;
}
static int get_packetheader(NUTContext *nut, ByteIOContext *bc, int prefix_length)
@@ -330,21 +343,12 @@ static int put_v(ByteIOContext *bc, uint64_t val)
return 0;
}
-static int put_b(ByteIOContext *bc, char *data, int len)
-{
- int i;
+static int put_str(ByteIOContext *bc, const char *string){
+ int len= strlen(string);
put_v(bc, len);
- for (i = 0; i < len; i++)
- put_byte(bc, data[i]);
-
- return 0;
-}
-
-static int put_bi(ByteIOContext *bc, int val)
-{
- put_v(bc, 4);
- put_le32(bc, val);
+ put_buffer(bc, string, len);
+
return 0;
}
@@ -447,17 +451,17 @@ static int nut_write_header(AVFormatContext *s)
put_v(bc, i /*s->streams[i]->index*/);
put_v(bc, (codec->codec_type == CODEC_TYPE_AUDIO) ? 32 : 0);
if (codec->codec_tag)
- put_bi(bc, codec->codec_tag);
+ put_v(bc, codec->codec_tag);
else if (codec->codec_type == CODEC_TYPE_VIDEO)
{
- int tmp = codec_get_bmp_tag(codec->codec_id);
- put_bi(bc, tmp);
+ put_v(bc, codec_get_bmp_tag(codec->codec_id));
}
else if (codec->codec_type == CODEC_TYPE_AUDIO)
{
- int tmp = codec_get_wav_tag(codec->codec_id);
- put_bi(bc, tmp);
+ put_v(bc, codec_get_wav_tag(codec->codec_id));
}
+ else
+ put_v(bc, 0);
if (codec->codec_type == CODEC_TYPE_VIDEO)
{
@@ -520,40 +524,38 @@ static int nut_write_header(AVFormatContext *s)
update_packetheader(nut, bc, 0);
}
-#if 0
/* info header */
put_be64(bc, INFO_STARTCODE);
- put_packetheader(nut, bc, 16+strlen(s->author)+strlen(s->title)+
- strlen(s->comment)+strlen(s->copyright));
+ put_packetheader(nut, bc, 30+strlen(s->author)+strlen(s->title)+
+ strlen(s->comment)+strlen(s->copyright)+strlen(LIBAVFORMAT_IDENT));
if (s->author[0])
{
- put_v(bc, 5); /* type */
- put_b(bc, s->author, strlen(s->author));
+ put_v(bc, 9); /* type */
+ put_str(bc, s->author);
}
if (s->title[0])
{
- put_v(bc, 6); /* type */
- put_b(bc, s->title, strlen(s->title));
+ put_v(bc, 10); /* type */
+ put_str(bc, s->title);
}
if (s->comment[0])
{
- put_v(bc, 7); /* type */
- put_b(bc, s->comment, strlen(s->comment));
+ put_v(bc, 11); /* type */
+ put_str(bc, s->comment);
}
if (s->copyright[0])
{
- put_v(bc, 8); /* type */
- put_b(bc, s->copyright, strlen(s->copyright));
+ put_v(bc, 12); /* type */
+ put_str(bc, s->copyright);
}
/* encoder */
- put_v(bc, 9); /* type */
- put_b(bc, LIBAVFORMAT_IDENT "\0", strlen(LIBAVFORMAT_IDENT));
+ put_v(bc, 13); /* type */
+ put_str(bc, LIBAVFORMAT_IDENT);
put_v(bc, 0); /* eof info */
put_be32(bc, 0); /* FIXME: checksum */
update_packetheader(nut, bc, 0);
-#endif
put_flush_packet(bc);
@@ -839,7 +841,7 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
if (!st)
return AVERROR_NOMEM;
class = get_v(bc);
- tmp = get_bi(bc);
+ tmp = get_v(bc);
switch(class)
{
case 0:
@@ -859,7 +861,7 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
return -1;
}
s->bit_rate += get_v(bc);
- get_b(bc, NULL, 0); /* language code */
+ get_v(bc); /* language code */
nom = get_v(bc);
denom = get_v(bc);
nut->stream[cur_stream].msb_timestamp_shift = get_v(bc);
@@ -896,7 +898,54 @@ static int nut_read_header(AVFormatContext *s, AVFormatParameters *ap)
get_be32(bc); /* checksum */
nut->stream[cur_stream].rate_num= nom;
nut->stream[cur_stream].rate_den= denom;
- }
+ }
+
+ tmp = get_be64(bc);
+ if (tmp == INFO_STARTCODE){
+ get_packetheader(nut, bc, 8);
+
+ for(;;){
+ int id= get_v(bc);
+ char *name, *type, custom_name[256], custom_type[256];
+
+ if(!id)
+ break;
+ else if(id >= sizeof(info_table)/sizeof(info_table[0])){
+ av_log(s, AV_LOG_ERROR, "info id is too large %d %d\n", id, sizeof(info_table)/sizeof(info_table[0]));
+ return -1;
+ }
+
+ type= info_table[id][1];
+ name= info_table[id][0];
+//av_log(s, AV_LOG_DEBUG, "%d %s %s\n", id, type, name);
+
+ if(!type){
+ get_str(bc, custom_type, sizeof(custom_type));
+ type= custom_type;
+ }
+ if(!name){
+ get_str(bc, custom_name, sizeof(custom_name));
+ name= custom_name;
+ }
+
+ if(!strcmp(type, "v")){
+ int value= get_v(bc);
+ }else{
+ if(!strcmp(name, "Author"))
+ get_str(bc, s->author, sizeof(s->author));
+ else if(!strcmp(name, "Title"))
+ get_str(bc, s->title, sizeof(s->title));
+ else if(!strcmp(name, "Copyright"))
+ get_str(bc, s->copyright, sizeof(s->copyright));
+ else if(!strcmp(name, "Description"))
+ get_str(bc, s->comment, sizeof(s->comment));
+ else
+ get_str(bc, NULL, 0);
+ }
+ }
+ get_be32(bc); /* checksum */
+ }else
+ url_fseek(bc, -8, SEEK_CUR);
return 0;
}