]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/asf.c
Remove Fabrice's copyright from the Makefiles. They have been entirely
[ffmpeg] / libavformat / asf.c
index 7b1ad67804f211387539b0d05d11c698ccea3eac..040ac7c6b201f8f11ce98f4dc00ed92d3edd85bf 100644 (file)
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
+
+#include "libavutil/common.h"
+#include "libavcodec/mpegaudio.h"
 #include "avformat.h"
 #include "riff.h"
-#include "mpegaudio.h"
 #include "asf.h"
-#include "common.h"
 #include "asfcrypt.h"
 
+extern void ff_mms_set_stream_selection(URLContext *h, AVFormatContext *format);
+
 #undef NDEBUG
 #include <assert.h>
 
@@ -85,7 +88,7 @@ static void print_guid(const GUID *g)
 static void get_guid(ByteIOContext *s, GUID *g)
 {
     assert(sizeof(*g) == 16);
-    get_buffer(s, g, sizeof(*g));
+    get_buffer(s, *g, sizeof(*g));
 }
 
 #if 0
@@ -140,7 +143,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     ASFContext *asf = s->priv_data;
     GUID g;
-    ByteIOContext *pb = &s->pb;
+    ByteIOContext *pb = s->pb;
     AVStream *st;
     ASFStream *asf_st;
     int size, i;
@@ -184,8 +187,8 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
             asf->hdr.file_size          = get_le64(pb);
             asf->hdr.create_time        = get_le64(pb);
             asf->nb_packets             = get_le64(pb);
-            asf->hdr.send_time          = get_le64(pb);
             asf->hdr.play_time          = get_le64(pb);
+            asf->hdr.send_time          = get_le64(pb);
             asf->hdr.preroll            = get_le32(pb);
             asf->hdr.ignore             = get_le32(pb);
             asf->hdr.flags              = get_le32(pb);
@@ -387,10 +390,15 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
                         get_str16_nolen(pb, name_len, name, sizeof(name));
                         value_type = get_le16(pb);
                         value_len = get_le16(pb);
-                        if ((value_type == 0) || (value_type == 1)) // unicode or byte
+                        if (value_type <= 1) // unicode or byte
                         {
                                 if     (!strcmp(name,"WM/AlbumTitle")) get_str16_nolen(pb, value_len, s->album, sizeof(s->album));
                                 else if(!strcmp(name,"WM/Genre"     )) get_str16_nolen(pb, value_len, s->genre, sizeof(s->genre));
+                                else if(!strcmp(name,"WM/Year"      )) {
+                                    char year[8];
+                                    get_str16_nolen(pb, value_len, year, sizeof(year));
+                                    s->year = atoi(year);
+                                }
                                 else if(!strcmp(name,"WM/Track") && s->track == 0) {
                                     char track[8];
                                     get_str16_nolen(pb, value_len, track, sizeof(track));
@@ -403,12 +411,13 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
                                 }
                                 else url_fskip(pb, value_len);
                         }
-                        if ((value_type >= 2) && (value_type <= 5)) // boolean or DWORD or QWORD or WORD
+                        else if (value_type <= 5) // boolean or DWORD or QWORD or WORD
                         {
                                 value_num= get_value(pb, value_type);
                                 if (!strcmp(name,"WM/Track"      ) && s->track == 0) s->track = value_num + 1;
                                 if (!strcmp(name,"WM/TrackNumber")) s->track = value_num;
-                        }
+                        }else
+                            url_fskip(pb, value_len);
                 }
         } else if (!memcmp(&g, &metadata_header, sizeof(GUID))) {
             int n, stream_num, name_len, value_len, value_type, value_num;
@@ -563,12 +572,12 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
 static int asf_get_packet(AVFormatContext *s)
 {
     ASFContext *asf = s->priv_data;
-    ByteIOContext *pb = &s->pb;
+    ByteIOContext *pb = s->pb;
     uint32_t packet_length, padsize;
     int rsize = 8;
     int c, d, e, off;
 
-    off= (url_ftell(&s->pb) - s->data_offset) % asf->packet_size + 3;
+    off= (url_ftell(s->pb) - s->data_offset) % asf->packet_size + 3;
 
     c=d=e=-1;
     while(off-- > 0){
@@ -639,7 +648,7 @@ static int asf_get_packet(AVFormatContext *s)
  */
 static int asf_read_frame_header(AVFormatContext *s){
     ASFContext *asf = s->priv_data;
-    ByteIOContext *pb = &s->pb;
+    ByteIOContext *pb = s->pb;
     int rsize = 1;
     int num = get_byte(pb);
     int64_t ts0, ts1;
@@ -675,7 +684,7 @@ static int asf_read_frame_header(AVFormatContext *s){
             url_fskip(pb, asf->packet_replic_size - 8);
         rsize += asf->packet_replic_size; // FIXME - check validity
     } else if (asf->packet_replic_size==1){
-        // multipacket - frag_offset is begining timestamp
+        // multipacket - frag_offset is beginning timestamp
         asf->packet_time_start = asf->packet_frag_offset;
         asf->packet_frag_offset = 0;
         asf->packet_frag_timestamp = asf->packet_timestamp;
@@ -712,7 +721,7 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     ASFContext *asf = s->priv_data;
     ASFStream *asf_st = 0;
-    ByteIOContext *pb = &s->pb;
+    ByteIOContext *pb = s->pb;
     //static int pc = 0;
     for (;;) {
         if(url_feof(pb))
@@ -726,7 +735,7 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
             /* fail safe */
             url_fskip(pb, ret);
 
-            asf->packet_pos= url_ftell(&s->pb);
+            asf->packet_pos= url_ftell(s->pb);
             if (asf->data_object_size != (uint64_t)-1 &&
                 (asf->packet_pos - asf->data_object_offset >= asf->data_object_size))
                 return AVERROR(EIO); /* Do not exceed the size of the data object */
@@ -759,7 +768,7 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
         asf_st = asf->asf_st;
 
         if (asf->packet_replic_size == 1) {
-            // frag_offset is here used as the begining timestamp
+            // frag_offset is here used as the beginning timestamp
             asf->packet_frag_timestamp = asf->packet_time_start;
             asf->packet_time_start += asf->packet_time_delta;
             asf->packet_obj_size = asf->packet_frag_size = get_byte(pb);
@@ -949,7 +958,7 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos,
 
     pos= (pos+asf->packet_size-1-s->data_offset)/asf->packet_size*asf->packet_size+ s->data_offset;
     *ppos= pos;
-    url_fseek(&s->pb, pos, SEEK_SET);
+    url_fseek(s->pb, pos, SEEK_SET);
 
 //printf("asf_read_pts\n");
     asf_reset_header(s);
@@ -993,21 +1002,21 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
     int i;
     int pct,ict;
 
-    current_pos = url_ftell(&s->pb);
+    current_pos = url_ftell(s->pb);
 
-    url_fseek(&s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET);
-    get_guid(&s->pb, &g);
+    url_fseek(s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET);
+    get_guid(s->pb, &g);
     if (!memcmp(&g, &index_guid, sizeof(GUID))) {
-        gsize = get_le64(&s->pb);
-        get_guid(&s->pb, &g);
-        itime=get_le64(&s->pb);
-        pct=get_le32(&s->pb);
-        ict=get_le32(&s->pb);
+        gsize = get_le64(s->pb);
+        get_guid(s->pb, &g);
+        itime=get_le64(s->pb);
+        pct=get_le32(s->pb);
+        ict=get_le32(s->pb);
         av_log(NULL, AV_LOG_DEBUG, "itime:0x%"PRIx64", pct:%d, ict:%d\n",itime,pct,ict);
 
         for (i=0;i<ict;i++){
-            int pktnum=get_le32(&s->pb);
-            int pktct =get_le16(&s->pb);
+            int pktnum=get_le32(s->pb);
+            int pktct =get_le16(s->pb);
             av_log(NULL, AV_LOG_DEBUG, "pktnum:%d, pktct:%d\n", pktnum, pktct);
 
             pos=s->data_offset + asf->packet_size*(int64_t)pktnum;
@@ -1017,7 +1026,7 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
         }
         asf->index_read= 1;
     }
-    url_fseek(&s->pb, current_pos, SEEK_SET);
+    url_fseek(s->pb, current_pos, SEEK_SET);
 }
 
 static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags)
@@ -1030,6 +1039,15 @@ static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int
     if (asf->packet_size <= 0)
         return -1;
 
+    /* Try using the protocol's read_seek if available */
+    if(s->pb) {
+        int ret = av_url_read_fseek(s->pb, stream_index, pts, flags);
+        if(ret >= 0)
+            asf_reset_header(s);
+        if (ret != AVERROR(ENOSYS))
+            return ret;
+    }
+
     if (!asf->index_read)
         asf_build_simple_index(s, stream_index);
 
@@ -1047,10 +1065,10 @@ static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int
 
     // various attempts to find key frame have failed so far
     //    asf_reset_header(s);
-    //    url_fseek(&s->pb, pos, SEEK_SET);
+    //    url_fseek(s->pb, pos, SEEK_SET);
     //    key_pos = pos;
     //     for(i=0;i<16;i++){
-    //         pos = url_ftell(&s->pb);
+    //         pos = url_ftell(s->pb);
     //         if (av_read_frame(s, &pkt) < 0){
     //             av_log(s, AV_LOG_INFO, "seek failed\n");
     //             return -1;
@@ -1068,7 +1086,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int
 
         /* do the seek */
         av_log(NULL, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos);
-        url_fseek(&s->pb, pos, SEEK_SET);
+        url_fseek(s->pb, pos, SEEK_SET);
     }
     asf_reset_header(s);
     return 0;
@@ -1076,7 +1094,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int
 
 AVInputFormat asf_demuxer = {
     "asf",
-    "asf format",
+    NULL_IF_CONFIG_SMALL("ASF format"),
     sizeof(ASFContext),
     asf_probe,
     asf_read_header,