correct AUDIO strf parsing patch by (Roman Shaposhnick <rvs at sun dot com>)
[ffmpeg.git] / libavformat / asf.c
index 3635913..b9cd71e 100644 (file)
@@ -31,7 +31,7 @@ typedef struct {
     AVPacket pkt;
     int frag_offset;
     int timestamp;
-    INT64 duration;
+    int64_t duration;
 
     int ds_span;               /* descrambling  */
     int ds_packet_size;
@@ -42,10 +42,10 @@ typedef struct {
 } ASFStream;
 
 typedef struct {
-    UINT32 v1;
-    UINT16 v2;
-    UINT16 v3;
-    UINT8 v4[8];
+    uint32_t v1;
+    uint16_t v2;
+    uint16_t v3;
+    uint8_t v4[8];
 } GUID;
 
 typedef struct __attribute__((packed)) {
@@ -83,14 +83,14 @@ typedef struct {
     int asfid2avid[128];        /* conversion table from asf ID 2 AVStream ID */
     ASFStream streams[128];    /* it's max number and it's not that big */
     /* non streamed additonnal info */
-    INT64 nb_packets;
-    INT64 duration; /* in 100ns units */
+    int64_t nb_packets;
+    int64_t duration; /* in 100ns units */
     /* packet filling */
     int packet_size_left;
     int packet_timestamp_start;
     int packet_timestamp_end;
     int packet_nb_frames;
-    UINT8 packet_buf[PACKET_SIZE];
+    uint8_t packet_buf[PACKET_SIZE];
     ByteIOContext pb;
     /* only for reading */
     uint64_t data_offset; /* begining of the first data packet */
@@ -199,7 +199,7 @@ static void put_str16(ByteIOContext *s, const char *tag)
 
     put_le16(s,strlen(tag) + 1);
     for(;;) {
-        c = (UINT8)*tag++;
+        c = (uint8_t)*tag++;
         put_le16(s, c);
         if (c == '\0')
             break;
@@ -211,16 +211,16 @@ static void put_str16_nolen(ByteIOContext *s, const char *tag)
     int c;
 
     for(;;) {
-        c = (UINT8)*tag++;
+        c = (uint8_t)*tag++;
         put_le16(s, c);
         if (c == '\0')
             break;
     }
 }
 
-static INT64 put_header(ByteIOContext *pb, const GUID *g)
+static int64_t put_header(ByteIOContext *pb, const GUID *g)
 {
-    INT64 pos;
+    int64_t pos;
 
     pos = url_ftell(pb);
     put_guid(pb, g);
@@ -229,9 +229,9 @@ static INT64 put_header(ByteIOContext *pb, const GUID *g)
 }
 
 /* update header size */
-static void end_header(ByteIOContext *pb, INT64 pos)
+static void end_header(ByteIOContext *pb, int64_t pos)
 {
-    INT64 pos1;
+    int64_t pos1;
 
     pos1 = url_ftell(pb);
     url_fseek(pb, pos + 16, SEEK_SET);
@@ -256,24 +256,24 @@ static void put_chunk(AVFormatContext *s, int type, int payload_length, int flag
 }
 
 /* convert from unix to windows time */
-static INT64 unix_to_file_time(int ti)
+static int64_t unix_to_file_time(int ti)
 {
-    INT64 t;
+    int64_t t;
 
-    t = ti * INT64_C(10000000);
-    t += INT64_C(116444736000000000);
+    t = ti * int64_t_C(10000000);
+    t += int64_t_C(116444736000000000);
     return t;
 }
 
 /* write the header (used two times if non streamed) */
-static int asf_write_header1(AVFormatContext *s, INT64 file_size, INT64 data_chunk_size)
+static int asf_write_header1(AVFormatContext *s, int64_t file_size, int64_t data_chunk_size)
 {
     ASFContext *asf = s->priv_data;
     ByteIOContext *pb = &s->pb;
     int header_size, n, extra_size, extra_size2, wav_extra_size, file_time;
     int has_title;
     AVCodecContext *enc;
-    INT64 header_offset, cur_pos, hpos;
+    int64_t header_offset, cur_pos, hpos;
     int bit_rate;
 
     has_title = (s->title[0] || s->author[0] || s->copyright[0] || s->comment[0]);
@@ -337,7 +337,7 @@ static int asf_write_header1(AVFormatContext *s, INT64 file_size, INT64 data_chu
 
     /* stream headers */
     for(n=0;n<s->nb_streams;n++) {
-        INT64 es_pos;
+        int64_t es_pos;
         //        ASFStream *stream = &asf->streams[n];
 
         enc = &s->streams[n]->codec;
@@ -556,7 +556,7 @@ static void put_frame_header(AVFormatContext *s, ASFStream *stream, int timestam
     int val;
 
     val = stream->num;
-    if (s->streams[val - 1]->codec.coded_picture->key_frame /* && frag_offset == 0 */)
+    if (s->streams[val - 1]->codec.coded_frame->key_frame /* && frag_offset == 0 */)
         val |= 0x80;
     put_byte(pb, val);
     put_byte(pb, stream->seq);
@@ -574,7 +574,7 @@ static void put_frame_header(AVFormatContext *s, ASFStream *stream, int timestam
    crap. They have misread the MPEG Systems spec !
  */
 static void put_frame(AVFormatContext *s, ASFStream *stream, int timestamp,
-                      UINT8 *buf, int payload_size)
+                      uint8_t *buf, int payload_size)
 {
     ASFContext *asf = s->priv_data;
     int frag_pos, frag_len, frag_len1;
@@ -607,22 +607,22 @@ static void put_frame(AVFormatContext *s, ASFStream *stream, int timestamp,
 
 
 static int asf_write_packet(AVFormatContext *s, int stream_index,
-                            UINT8 *buf, int size, int timestamp)
+                            uint8_t *buf, int size, int timestamp)
 {
     ASFContext *asf = s->priv_data;
     ASFStream *stream;
-    INT64 duration;
+    int64_t duration;
     AVCodecContext *codec;
 
     codec = &s->streams[stream_index]->codec;
     stream = &asf->streams[stream_index];
 
     if (codec->codec_type == CODEC_TYPE_AUDIO) {
-        duration = (codec->frame_number * codec->frame_size * INT64_C(10000000)) /
+        duration = (codec->frame_number * codec->frame_size * int64_t_C(10000000)) /
             codec->sample_rate;
     } else {
         duration = codec->frame_number *
-            ((INT64_C(10000000) * FRAME_RATE_BASE) / codec->frame_rate);
+            ((int64_t_C(10000000) * FRAME_RATE_BASE) / codec->frame_rate);
     }
     if (duration > asf->duration)
         asf->duration = duration;
@@ -634,7 +634,7 @@ static int asf_write_packet(AVFormatContext *s, int stream_index,
 static int asf_write_trailer(AVFormatContext *s)
 {
     ASFContext *asf = s->priv_data;
-    INT64 file_size;
+    int64_t file_size;
 
     /* flush the current packet */
     if (asf->pb.buf_ptr > asf->pb.buffer)
@@ -659,14 +659,36 @@ static int asf_write_trailer(AVFormatContext *s)
 //#define DEBUG
 
 #ifdef DEBUG
+#define PRINT_IF_GUID(g,cmp) \
+if (!memcmp(g, &cmp, sizeof(GUID))) \
+    printf("(GUID: %s) ", #cmp)
+
 static void print_guid(const GUID *g)
 {
     int i;
+    PRINT_IF_GUID(g, asf_header);
+    else PRINT_IF_GUID(g, file_header);
+    else PRINT_IF_GUID(g, stream_header);
+    else PRINT_IF_GUID(g, audio_stream);
+    else PRINT_IF_GUID(g, audio_conceal_none);
+    else PRINT_IF_GUID(g, video_stream);
+    else PRINT_IF_GUID(g, video_conceal_none);
+    else PRINT_IF_GUID(g, comment_header);
+    else PRINT_IF_GUID(g, codec_comment_header);
+    else PRINT_IF_GUID(g, codec_comment1_header);
+    else PRINT_IF_GUID(g, data_header);
+    else PRINT_IF_GUID(g, index_guid);
+    else PRINT_IF_GUID(g, head1_guid);
+    else PRINT_IF_GUID(g, head2_guid);
+    else PRINT_IF_GUID(g, my_guid);
+    else
+        printf("(GUID: unknown) ");
     printf("0x%08x, 0x%04x, 0x%04x, {", g->v1, g->v2, g->v3);
     for(i=0;i<8;i++)
         printf(" 0x%02x,", g->v4[i]);
     printf("}\n");
 }
+#undef PRINT_IF_GUID(g,cmp)
 #endif
 
 static void get_guid(ByteIOContext *s, GUID *g)
@@ -746,7 +768,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
     AVStream *st;
     ASFStream *asf_st;
     int size, i;
-    INT64 gsize;
+    int64_t gsize;
 
     av_set_pts_info(s, 32, 1, 1000); /* 32 bit pts in ms */
 
@@ -784,9 +806,9 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
            asf->packet_size = asf->hdr.max_pktsize;
             asf->nb_packets = asf->hdr.packets_count;
         } else if (!memcmp(&g, &stream_header, sizeof(GUID))) {
-            int type, total_size;
+            int type, total_size, type_specific_size;
             unsigned int tag1;
-            INT64 pos1, pos2;
+            int64_t pos1, pos2;
 
             pos1 = url_ftell(pb);
 
@@ -810,7 +832,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
             }
             get_guid(pb, &g);
             total_size = get_le64(pb);
-            get_le32(pb);
+            type_specific_size = get_le32(pb);
             get_le32(pb);
            st->id = get_le16(pb) & 0x7f; /* stream id */
             // mapping of asf ID to AV stream ID;
@@ -820,7 +842,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
            st->codec.codec_type = type;
             st->codec.frame_rate = 15 * s->pts_den / s->pts_num; // 15 fps default
             if (type == CODEC_TYPE_AUDIO) {
-                get_wav_header(pb, &st->codec, 1);
+                get_wav_header(pb, &st->codec, type_specific_size);
                /* We have to init the frame size at some point .... */
                pos2 = url_ftell(pb);
                if (gsize > (pos2 + 8 - pos1 + 24)) {
@@ -875,7 +897,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
                    st->codec.extradata = av_mallocz(st->codec.extradata_size);
                    get_buffer(pb, st->codec.extradata, st->codec.extradata_size);
                }
-                st->codec.codec_tag = st->codec.fourcc = tag1;
+                st->codec.codec_tag = tag1;
                st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);
             }
             pos2 = url_ftell(pb);
@@ -1217,7 +1239,7 @@ static AVInputFormat asf_iformat = {
 static AVOutputFormat asf_oformat = {
     "asf",
     "asf format",
-    "application/octet-stream",
+    "video/x-ms-asf",
     "asf,wmv",
     sizeof(ASFContext),
 #ifdef CONFIG_MP3LAME
@@ -1234,7 +1256,7 @@ static AVOutputFormat asf_oformat = {
 static AVOutputFormat asf_stream_oformat = {
     "asf_stream",
     "asf format",
-    "application/octet-stream",
+    "video/x-ms-asf",
     "asf,wmv",
     sizeof(ASFContext),
 #ifdef CONFIG_MP3LAME