]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
AVPacket.pos
authormichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Thu, 26 May 2005 20:17:12 +0000 (20:17 +0000)
committermichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Thu, 26 May 2005 20:17:12 +0000 (20:17 +0000)
git-svn-id: file:///var/local/repositories/ffmpeg/trunk@4314 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

30 files changed:
libavformat/4xm.c
libavformat/amr.c
libavformat/asf.c
libavformat/au.c
libavformat/avformat.h
libavformat/avidec.c
libavformat/electronicarts.c
libavformat/ffm.c
libavformat/flic.c
libavformat/flvdec.c
libavformat/idcin.c
libavformat/idroq.c
libavformat/ipmovie.c
libavformat/matroska.c
libavformat/mov.c
libavformat/mp3.c
libavformat/mpegts.c
libavformat/nsvdec.c
libavformat/nut.c
libavformat/psxstr.c
libavformat/raw.c
libavformat/rm.c
libavformat/segafilm.c
libavformat/sierravmd.c
libavformat/sol.c
libavformat/swf.c
libavformat/utils.c
libavformat/wc3movie.c
libavformat/westwood.c
libavformat/yuv4mpeg.c

index 5ce1f43f5e9d09c110b33f68c14763bd42e5bd7e..7c0f78e6b9b1a06995788b379f0e2252ded2ea87 100644 (file)
@@ -277,6 +277,7 @@ static int fourxm_read_packet(AVFormatContext *s,
                 return AVERROR_IO;
             pkt->stream_index = fourxm->video_stream_index;
             pkt->pts = fourxm->video_pts;
+            pkt->pos = url_ftell(&s->pb);
             memcpy(pkt->data, header, 8);
             ret = get_buffer(&s->pb, &pkt->data[8], size);
 
@@ -293,16 +294,13 @@ static int fourxm_read_packet(AVFormatContext *s,
             size-=8;
 
             if (track_number == fourxm->selected_track) {
-                if (av_new_packet(pkt, size))
+                ret= av_get_packet(&s->pb, pkt, size);
+                if(ret<0)
                     return AVERROR_IO;
                 pkt->stream_index = 
                     fourxm->tracks[fourxm->selected_track].stream_index;
                 pkt->pts = fourxm->audio_pts;
-                ret = get_buffer(&s->pb, pkt->data, size);
-                if (ret < 0)
-                    av_free_packet(pkt);
-                else
-                    packet_read = 1;
+                packet_read = 1;
 
                 /* pts accounting */
                 audio_frame_count = size;
index 21f41b7619a413862ed16dfc3fe21e6613cf49f0..64c387b5eedeede3f2c80fdbb94ca41bf717b08a 100644 (file)
@@ -154,7 +154,7 @@ static int amr_read_packet(AVFormatContext *s,
             return AVERROR_IO;
         }
         pkt->stream_index = 0;
-        
+        pkt->pos= url_ftell(&s->pb);
         pkt->data[0]=toc;
     
         read = get_buffer(&s->pb, pkt->data+1, size);
@@ -189,6 +189,7 @@ static int amr_read_packet(AVFormatContext *s,
         }
     
         pkt->stream_index = 0;
+        pkt->pos= url_ftell(&s->pb);
         pkt->data[0]=toc;
     
         read = get_buffer(&s->pb, pkt->data+1, size-1);
index 4a480bf45cd3d2672875989ca6b240d35935c008..045766dbff0818eb605842efa5f839ce3e5b4f11 100644 (file)
@@ -604,6 +604,7 @@ static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
            asf_st->seq = asf->packet_seq;
            asf_st->pkt.pts = asf->packet_frag_timestamp;
            asf_st->pkt.stream_index = asf->stream_index;
+            asf_st->pkt.pos = 
             asf_st->packet_pos= asf->packet_pos;            
 //printf("new packet: stream:%d key:%d packet_key:%d audio:%d size:%d\n", 
 //asf->stream_index, asf->packet_key_frame, asf_st->pkt.flags & PKT_FLAG_KEY,
index 1709c874ec8a9782fc4faba96c792685adae1bc9..984180ab4b1cc60eb1e067e2aa0e0ae1719c317e 100644 (file)
@@ -161,13 +161,11 @@ static int au_read_packet(AVFormatContext *s,
 
     if (url_feof(&s->pb))
         return AVERROR_IO;
-    if (av_new_packet(pkt, MAX_SIZE))
+    ret= av_get_packet(&s->pb, pkt, MAX_SIZE);
+    if (ret < 0)
         return AVERROR_IO;
     pkt->stream_index = 0;
 
-    ret = get_buffer(&s->pb, pkt->data, pkt->size);
-    if (ret < 0)
-        av_free_packet(pkt);
     /* note: we need to modify the packet size here to handle the last
        packet */
     pkt->size = ret;
index f19ea89e3ee209afd0d961c5ff93dee3532de8d6..0f73e8c7f0ed118941b910acfbb96996d5b6c543 100644 (file)
@@ -5,7 +5,7 @@
 extern "C" {
 #endif
 
-#define LIBAVFORMAT_BUILD       4624
+#define LIBAVFORMAT_BUILD       4625
 
 #define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
 #define LIBAVFORMAT_VERSION     FFMPEG_VERSION
@@ -28,17 +28,16 @@ extern "C" {
 #endif
 
 typedef struct AVPacket {
-    int64_t pts; /* presentation time stamp in AV_TIME_BASE units (or
-                    pts_den units in muxers or demuxers) */
-    int64_t dts; /* decompression time stamp in AV_TIME_BASE units (or
-                    pts_den units in muxers or demuxers) */
+    int64_t pts;                            ///< presentation time stamp in time_base units
+    int64_t dts;                            ///< decompression time stamp in time_base units
     uint8_t *data;
     int   size;
     int   stream_index;
     int   flags;
-    int   duration; /* presentation duration (0 if not available) */
+    int   duration;                         ///< presentation duration in time_base units (0 if not available)
     void  (*destruct)(struct AVPacket *);
     void  *priv;
+    int64_t pos;                            ///< byte position in stream, -1 if unknown
 } AVPacket; 
 #define PKT_FLAG_KEY   0x0001
 
@@ -49,6 +48,7 @@ static inline void av_init_packet(AVPacket *pkt)
 {
     pkt->pts   = AV_NOPTS_VALUE;
     pkt->dts   = AV_NOPTS_VALUE;
+    pkt->pos   = -1;
     pkt->duration = 0;
     pkt->flags = 0;
     pkt->stream_index = 0;
@@ -56,6 +56,7 @@ static inline void av_init_packet(AVPacket *pkt)
 }
 
 int av_new_packet(AVPacket *pkt, int size);
+int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size);
 int av_dup_packet(AVPacket *pkt);
 
 /**
index 1f636a0a5053e0cfd75105c631e3d39e5a0bf683..14fa2b5eff2c13d87a43daba7b74816d15e1bd7a 100644 (file)
@@ -423,8 +423,7 @@ resync:
 
         if(size > ast->remaining)
             size= ast->remaining;
-        av_new_packet(pkt, size);
-        get_buffer(pb, pkt->data, size);
+        av_get_packet(pb, pkt, size);
         
         if (avi->dv_demux) {
             dstr = pkt->destruct;
index 6bb86af0b35072184a82ef8648ba13c81cfe01d6..2d8bdadb573afa0a2a5fddfa6ca86e9377423fca 100644 (file)
@@ -234,13 +234,10 @@ static int ea_read_packet(AVFormatContext *s,
         switch (chunk_type) {
         /* audio data */
         case SCDl_TAG:
-            if (av_new_packet(pkt, chunk_size))
+            ret = av_get_packet(pb, pkt, chunk_size);
+            if (ret != chunk_size)
                 ret = AVERROR_IO;
             else {
-                ret = get_buffer(pb, pkt->data, chunk_size);
-                if (ret != chunk_size)
-                    ret = AVERROR_IO;
-                else {
                     pkt->stream_index = ea->audio_stream_index;
                     pkt->pts = 90000;
                     pkt->pts *= ea->audio_frame_counter;
@@ -250,7 +247,6 @@ static int ea_read_packet(AVFormatContext *s,
                      * on stereo; chunk also has 12-byte header */
                     ea->audio_frame_counter += ((chunk_size - 12) * 2) /
                         ea->num_channels;
-                }
             }
 
             packet_read = 1;
index c8641ec87ba85b90e5a145f6fc52d8599645d81f..6fb069ace2cdd1a7ea6f8e46a1bdbf6fe0d13678 100644 (file)
@@ -603,6 +603,7 @@ static int ffm_read_packet(AVFormatContext *s, AVPacket *pkt)
 
         av_new_packet(pkt, size);
         pkt->stream_index = ffm->header[0];
+        pkt->pos = url_ftell(&s->pb); 
         if (ffm->header[1] & FLAG_KEY_FRAME)
             pkt->flags |= PKT_FLAG_KEY;
 
index 7fc3b9a33f73fd29b3d0eb9323de4499ea22c1d4..3fa27335db8429007f22f5e1f677939f98f065b7 100644 (file)
@@ -178,6 +178,7 @@ static int flic_read_packet(AVFormatContext *s,
             }
             pkt->stream_index = flic->video_stream_index;
             pkt->pts = flic->pts;
+            pkt->pos = url_ftell(pb); 
             memcpy(pkt->data, preamble, FLIC_PREAMBLE_SIZE);
             ret = get_buffer(pb, pkt->data + FLIC_PREAMBLE_SIZE, 
                 size - FLIC_PREAMBLE_SIZE);
index 942e188edc763a8cea36b255da9fd67e4e47f0fe..187a692ea93ea941307e855aed766d4fa1350552 100644 (file)
@@ -147,12 +147,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
             }
     }
 
-    if (av_new_packet(pkt, size) < 0)
-        return AVERROR_IO;
-
-    ret = get_buffer(&s->pb, pkt->data, size);
+    ret= av_get_packet(&s->pb, pkt, size);
     if (ret <= 0) {
-        av_free_packet(pkt);
         return AVERROR_IO;
     }
     /* note: we need to modify the packet size here to handle the last
index 164cf556c6c26559fe17f2b650891c36a00a35d2..aecc1098ddc8606e1e9e1ea39e37c0aa1edaf5c3 100644 (file)
@@ -255,26 +255,22 @@ static int idcin_read_packet(AVFormatContext *s,
         /* skip the number of decoded bytes (always equal to width * height) */
         url_fseek(pb, 4, SEEK_CUR);
         chunk_size -= 4;
-        if (av_new_packet(pkt, chunk_size))
-            ret = AVERROR_IO;
+        ret= av_get_packet(pb, pkt, chunk_size); 
+        if (ret != chunk_size)
+            return AVERROR_IO;
         pkt->stream_index = idcin->video_stream_index;
         pkt->pts = idcin->pts;
-        ret = get_buffer(pb, pkt->data, chunk_size);
-        if (ret != chunk_size)
-            ret = AVERROR_IO;
     } else {
         /* send out the audio chunk */
         if (idcin->current_audio_chunk)
             chunk_size = idcin->audio_chunk_size2;
         else
             chunk_size = idcin->audio_chunk_size1;
-        if (av_new_packet(pkt, chunk_size))
+        ret= av_get_packet(pb, pkt, chunk_size);
+        if (ret != chunk_size)
             return AVERROR_IO;
         pkt->stream_index = idcin->audio_stream_index;
         pkt->pts = idcin->pts;
-        ret = get_buffer(&s->pb, pkt->data, chunk_size);
-        if (ret != chunk_size)
-            ret = AVERROR_IO;
 
         idcin->current_audio_chunk ^= 1;
         idcin->pts += FRAME_PTS_INC;
index 13553ed847fe8fbeb6a10637aff8f9ca86198c0f..add882eef3ddf7bf700726ecbadf15ab77f61b84 100644 (file)
@@ -221,13 +221,11 @@ static int roq_read_packet(AVFormatContext *s,
             url_fseek(pb, codebook_offset, SEEK_SET);
 
             /* load up the packet */
-            if (av_new_packet(pkt, chunk_size))
+            ret= av_get_packet(pb, pkt, chunk_size);
+            if (ret != chunk_size)
                 return AVERROR_IO;
             pkt->stream_index = roq->video_stream_index;
             pkt->pts = roq->video_pts;
-            ret = get_buffer(pb, pkt->data, chunk_size);
-            if (ret != chunk_size)
-                ret = AVERROR_IO;
 
             roq->video_pts += roq->frame_pts_inc;
             packet_read = 1;
@@ -254,6 +252,7 @@ static int roq_read_packet(AVFormatContext *s,
                 roq->audio_frame_count += (chunk_size / roq->audio_channels);
             }
 
+            pkt->pos= url_ftell(pb);
             ret = get_buffer(pb, pkt->data + RoQ_CHUNK_PREAMBLE_SIZE,
                 chunk_size);
             if (ret != chunk_size)
index fc176fd633da8e942f0838ea6d41f974c08b4fc7..f2f0e9e2c1708665412a43f5903da5b308e9c7db 100644 (file)
@@ -140,16 +140,11 @@ static int load_ipmovie_packet(IPMVEContext *s, ByteIOContext *pb,
         audio_pts *= s->audio_frame_count;
         audio_pts /= s->audio_sample_rate;
 
-        if (av_new_packet(pkt, s->audio_chunk_size))
-            return CHUNK_NOMEM;
+        if (s->audio_chunk_size != av_get_packet(pb, pkt, s->audio_chunk_size))
+            return CHUNK_EOF;
 
         pkt->stream_index = s->audio_stream_index;
         pkt->pts = audio_pts;
-        if (get_buffer(pb, pkt->data, s->audio_chunk_size) != 
-            s->audio_chunk_size) {
-            av_free_packet(pkt);
-            return CHUNK_EOF;
-        }
 
         /* audio frame maintenance */
         if (s->audio_type != CODEC_ID_INTERPLAY_DPCM)
@@ -171,6 +166,7 @@ static int load_ipmovie_packet(IPMVEContext *s, ByteIOContext *pb,
         if (av_new_packet(pkt, s->decode_map_chunk_size + s->video_chunk_size))
             return CHUNK_NOMEM;
 
+        pkt->pos= s->decode_map_chunk_offset;
         url_fseek(pb, s->decode_map_chunk_offset, SEEK_SET);
         s->decode_map_chunk_offset = 0;
 
index cc23781d856da69eebd2b1c250a30f2f8412b1ef..0cb1efc6361b5da4253663d55ec921664ce67c2e 100644 (file)
@@ -2366,6 +2366,7 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
                 uint32_t *lace_size = NULL;
                 int n, track, flags, laces = 0;
                 uint64_t num;
+                int64_t pos= url_ftell(&matroska->ctx->pb);
 
                 if ((res = ebml_read_binary(matroska, &id, &data, &size)) < 0)
                     break;
@@ -2507,6 +2508,7 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
                             matroska->tracks[track]->stream_index;
 
                         pkt->pts = timecode / 1000000; /* ns to ms */
+                        pkt->pos= pos;
 
                         matroska_queue_packet(matroska, pkt);
                     }
index 7779ac0a4725299c9e6a8c46a08a02df020662c9..c2f7abffa019d655b24891f74509d49446a974f3 100644 (file)
@@ -253,9 +253,6 @@ typedef struct MOVStreamContext {
     int time_scale;
     long current_sample;
     long left_in_chunk; /* how many samples before next chunk */
-    /* specific MPEG4 header which is added at the beginning of the stream */
-    unsigned int header_len;
-    uint8_t *header_data;
     MOV_esds_t esds;
 } MOVStreamContext;
 
@@ -1672,7 +1669,6 @@ static void mov_free_stream_context(MOVStreamContext *sc)
         av_freep(&sc->sample_to_chunk);
         av_freep(&sc->sample_sizes);
         av_freep(&sc->keyframes);
-        av_freep(&sc->header_data);
         av_freep(&sc->stts_data);        
         av_freep(&sc->ctts_data);        
         av_freep(&sc);
@@ -1974,18 +1970,7 @@ readchunk:
         return -1;
     url_fseek(&s->pb, offset, SEEK_SET);
 
-    //av_log(NULL, AV_LOG_DEBUG, "READCHUNK hlen: %d  %d off: %Ld   pos:%Ld\n", size, sc->header_len, offset, url_ftell(&s->pb));
-    if (sc->header_len > 0) {
-        av_new_packet(pkt, size + sc->header_len);
-        memcpy(pkt->data, sc->header_data, sc->header_len);
-        get_buffer(&s->pb, pkt->data + sc->header_len, size);
-        /* free header */
-        av_freep(&sc->header_data);
-        sc->header_len = 0;
-    } else {
-        av_new_packet(pkt, size);
-        get_buffer(&s->pb, pkt->data, pkt->size);
-    }
+    av_get_packet(&s->pb, pkt, size);
     pkt->stream_index = sc->ffindex;
     
     // If the keyframes table exists, mark any samples that are in the table as key frames.
index ebd7ef4be13e1b254b36daeb6c32b3c96f75d686..ddc27dea6f8d7dfde8da834ed1bff27f7e6b0183 100644 (file)
@@ -297,13 +297,10 @@ static int mp3_read_packet(AVFormatContext *s, AVPacket *pkt)
     
     size= MP3_PACKET_SIZE;
 
-    if (av_new_packet(pkt, size) < 0)
-        return AVERROR_IO;
+    ret= av_get_packet(&s->pb, pkt, size);
 
     pkt->stream_index = 0;
-    ret = get_buffer(&s->pb, pkt->data, size);
     if (ret <= 0) {
-        av_free_packet(pkt);
         return AVERROR_IO;
     }
     /* note: we need to modify the packet size here to handle the last
index d100d22af3b9e9703eb8181883739ce0763f26ac..be966dd5b2e43a961ef4fd21e73e0f43c3089257 100644 (file)
@@ -1234,6 +1234,7 @@ static int mpegts_raw_read_packet(AVFormatContext *s,
 
     if (av_new_packet(pkt, TS_PACKET_SIZE) < 0)
         return -ENOMEM;
+    pkt->pos= url_ftell(&s->pb);
     ret = read_packet(&s->pb, pkt->data, ts->raw_packet_size);
     if (ret < 0) {
         av_free_packet(pkt);
index fa8adf0765879f630e803437c965d409d024f0a5..91c2aabe69c4e5363c6a97e0021ce4b36377c168 100644 (file)
@@ -592,8 +592,7 @@ null_chunk_retry:
     if (vsize/* && st[NSV_ST_VIDEO]*/) {
         nst = st[NSV_ST_VIDEO]->priv_data;
         pkt = &nsv->ahead[NSV_ST_VIDEO];
-        av_new_packet(pkt, vsize);
-        get_buffer(pb, pkt->data, vsize);
+        av_get_packet(pb, pkt, vsize);
         pkt->stream_index = st[NSV_ST_VIDEO]->index;//NSV_ST_VIDEO;
         pkt->dts = nst->frame_offset++;
         pkt->flags |= PKT_FLAG_KEY; /* stupid format has no way to tell XXX: try the index */
@@ -633,9 +632,7 @@ null_chunk_retry:
                 PRINT(("NSV RAWAUDIO: bps %d, nchan %d, srate %ld\n", bps, channels, samplerate));
             }
         }
-        av_new_packet(pkt, asize);
-        if (asize)
-            get_buffer(pb, pkt->data, asize);
+        av_get_packet(pb, pkt, asize);
         pkt->stream_index = st[NSV_ST_AUDIO]->index;//NSV_ST_AUDIO;
         //pkt->dts = nst->frame_offset;
         //if (nst->sample_size)
index 7c1557f12aa5e8ae7aa041ff5e97e3d1b8f26e85..7d3d8b8d52344dea6f4b39412e7daf62ad18a71e 100644 (file)
@@ -1236,8 +1236,7 @@ static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code, int fram
         return 1;
     }
 
-    av_new_packet(pkt, size);
-    get_buffer(bc, pkt->data, size);
+    av_get_packet(bc, pkt, size);
     pkt->stream_index = stream_id;
     if (key_frame)
        pkt->flags |= PKT_FLAG_KEY;
index eca6316f6cf3373bd0c9ae1ab7f92f7f20e0b69e..c8c3b2915ad14de35781132fb708ad298c16ada8 100644 (file)
@@ -283,6 +283,7 @@ static int str_read_packet(AVFormatContext *s,
                     if (av_new_packet(pkt, frame_size))
                         return AVERROR_IO;
 
+                    pkt->pos= url_ftell(pb) - RAW_CD_SECTOR_SIZE;
                     pkt->stream_index = 
                         str->channels[channel].video_stream_index;
                //     pkt->pts = str->pts;
index 243c03d01f9fb02ead7d696d989c3f618400b22e..8ae9a1b887e54144897577fac3f1bceeba8a36f1 100644 (file)
@@ -88,13 +88,10 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
     
     size= RAW_PACKET_SIZE;
 
-    if (av_new_packet(pkt, size) < 0)
-        return AVERROR_IO;
+    ret= av_get_packet(&s->pb, pkt, size);
 
     pkt->stream_index = 0;
-    ret = get_buffer(&s->pb, pkt->data, size);
     if (ret <= 0) {
-        av_free_packet(pkt);
         return AVERROR_IO;
     }
     /* note: we need to modify the packet size here to handle the last
@@ -111,7 +108,8 @@ static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
 
     if (av_new_packet(pkt, size) < 0)
         return AVERROR_IO;
-
+    
+    pkt->pos= url_ftell(&s->pb);
     pkt->stream_index = 0;
     ret = get_partial_buffer(&s->pb, pkt->data, size);
     if (ret <= 0) {
@@ -618,18 +616,10 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
     if (packet_size < 0)
         return -1;
 
-    if (av_new_packet(pkt, packet_size) < 0)
-        return AVERROR_IO;
+    ret= av_get_packet(&s->pb, pkt, packet_size);
 
     pkt->stream_index = 0;
-#if 0
-    /* bypass buffered I/O */
-    ret = url_read(url_fileno(&s->pb), pkt->data, pkt->size);
-#else
-    ret = get_buffer(&s->pb, pkt->data, pkt->size);
-#endif
-    if (ret != pkt->size) {
-        av_free_packet(pkt);
+    if (ret != packet_size) {
         return AVERROR_IO;
     } else {
         return 0;
index 58a3cab46031d82a7d1de877bea0fa3b509766f2..f0fe17974b8fbb03ed332a84c44506ddc74d16d3 100644 (file)
@@ -812,11 +812,9 @@ static int rm_read_packet(AVFormatContext *s, AVPacket *pkt)
     if (rm->old_format) {
         /* just read raw bytes */
         len = RAW_PACKET_SIZE;
-        av_new_packet(pkt, len);
+        len= av_get_packet(pb, pkt, len);
         pkt->stream_index = 0;
-        len = get_buffer(pb, pkt->data, len);
         if (len <= 0) {
-            av_free_packet(pkt);
             return AVERROR_IO;
         }
         pkt->size = len;
@@ -860,9 +858,8 @@ resync:
             goto resync;
         }
         
-        av_new_packet(pkt, len);
+        av_get_packet(pb, pkt, len);
         pkt->stream_index = i;
-        get_buffer(pb, pkt->data, len);
 
 #if 0
         if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
index d984a3b10bc247ca12c24404611688517d6c7ed1..d2954881ed98c61ad996ed4ffb884941aeb04863 100644 (file)
@@ -233,6 +233,7 @@ static int film_read_packet(AVFormatContext *s,
             return AVERROR_NOMEM;
         if(pkt->size < 10)
             return -1;
+        pkt->pos= url_ftell(pb);
         ret = get_buffer(pb, pkt->data, 10);
         /* skip the non-spec CVID bytes */
         url_fseek(pb, film->cvid_extra_bytes, SEEK_CUR);
@@ -254,6 +255,7 @@ static int film_read_packet(AVFormatContext *s,
             film->stereo_buffer = av_malloc(film->stereo_buffer_size);
         }
 
+        pkt->pos= url_ftell(pb);
         ret = get_buffer(pb, film->stereo_buffer, sample->sample_size);
         if (ret != sample->sample_size)
             ret = AVERROR_IO;
@@ -272,9 +274,7 @@ static int film_read_packet(AVFormatContext *s,
             }
         }
     } else {
-        if (av_new_packet(pkt, sample->sample_size))
-            return AVERROR_NOMEM;
-        ret = get_buffer(pb, pkt->data, sample->sample_size);
+        ret= av_get_packet(pb, pkt, sample->sample_size);
         if (ret != sample->sample_size)
             ret = AVERROR_IO;
     }
index b1484b560578031a7bb34d32ebe7eac7138a9cf6..152b4fb8f71fc00fd01cbf9359fd82cead1fd28b 100644 (file)
@@ -269,6 +269,7 @@ static int vmd_read_packet(AVFormatContext *s,
 
     if (av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD))
         return AVERROR_NOMEM;
+    pkt->pos= url_ftell(pb);
     memcpy(pkt->data, frame->frame_record, BYTES_PER_FRAME_RECORD);
     ret = get_buffer(pb, pkt->data + BYTES_PER_FRAME_RECORD, 
         frame->frame_size);
index 038feeaac678edb65f55fd49113d11bb71ca984d..eed1b38f3202d8c8619ab9fe7dc05c8991d5a929 100644 (file)
@@ -131,13 +131,9 @@ static int sol_read_packet(AVFormatContext *s,
 
     if (url_feof(&s->pb))
         return -EIO;
-    if (av_new_packet(pkt, MAX_SIZE))
-        return -EIO;
+    ret= av_get_packet(&s->pb, pkt, MAX_SIZE);
     pkt->stream_index = 0;
 
-    ret = get_buffer(&s->pb, pkt->data, pkt->size);
-    if (ret < 0)
-        av_free_packet(pkt);
     /* note: we need to modify the packet size here to handle the last
        packet */
     pkt->size = ret;
index 5f868994e4f2630f0885d479f225fc74645cb311..1a254b82ca3a1b056241c99c613f21f0fe44a6bb 100644 (file)
@@ -858,10 +858,9 @@ static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
                 if (st->id == 0) {
                     if ( get_le16(pb) == swf->ch_id ) {
                         frame = get_le16(pb);
-                        av_new_packet(pkt, len-4);
+                        av_get_packet(pb, pkt, len-4);
                         pkt->pts = frame * swf->ms_per_frame;
                         pkt->stream_index = st->index;
-                        get_buffer(pb, pkt->data, pkt->size);
                         return pkt->size;
                     } else {
                         url_fskip(pb, len-2);
@@ -874,9 +873,8 @@ static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
             for( i=0; i<s->nb_streams; i++ ) {
                st = s->streams[i];
                 if (st->id == 1) {
-                    av_new_packet(pkt, len);
+                    av_get_packet(pb, pkt, len);
                     pkt->stream_index = st->index;
-                    get_buffer(pb, pkt->data, pkt->size);
                     return pkt->size;
                 }
             }
index 9791cc268693cdb48e91f84558801025c7509594..45972e1f4a245d902ffa8bf87cfdd92b3ba1729e 100644 (file)
@@ -195,6 +195,31 @@ int av_new_packet(AVPacket *pkt, int size)
     return 0;
 }
 
+/**
+ * Allocate and read the payload of a packet and intialized its fields to default values.
+ *
+ * @param pkt packet
+ * @param size wanted payload size
+ * @return >0 (read size) if OK. AVERROR_xxx otherwise.
+ */
+int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size)
+{
+    int ret= av_new_packet(pkt, size);
+
+    if(ret<0)
+        return ret;
+
+    pkt->pos= url_ftell(s);
+
+    ret= get_buffer(s, pkt->data, size);
+    if(ret<=0)
+        av_free_packet(pkt);
+    else
+        pkt->size= ret;
+
+    return ret;
+}
+
 /* This is a hack - the packet memory allocation stuff is broken. The
    packet is allocated if it was not really allocated */
 int av_dup_packet(AVPacket *pkt)
index 6f9fedd3db373e29182fd92739412d1e159c777d..30417fef156a97491429b0d30efcef8e8ba22644 100644 (file)
@@ -318,11 +318,9 @@ static int wc3_read_packet(AVFormatContext *s,
 
         case VGA__TAG:
             /* send out video chunk */
-            if (av_new_packet(pkt, size))
-                ret = AVERROR_IO;
+            ret= av_get_packet(pb, pkt, size);
             pkt->stream_index = wc3->video_stream_index;
             pkt->pts = wc3->pts;
-            ret = get_buffer(pb, pkt->data, size);
             if (ret != size)
                 ret = AVERROR_IO;
             packet_read = 1;
@@ -349,11 +347,9 @@ static int wc3_read_packet(AVFormatContext *s,
 
         case AUDI_TAG:
             /* send out audio chunk */
-            if (av_new_packet(pkt, size))
-                ret = AVERROR_IO;
+            ret= av_get_packet(pb, pkt, size);
             pkt->stream_index = wc3->audio_stream_index;
             pkt->pts = wc3->pts;
-            ret = get_buffer(pb, pkt->data, size);
             if (ret != size)
                 ret = AVERROR_IO;
 
index 6fcb39ea71f969b924dee70c97ce99f83ff7cf75..22150e2a6414f30150dfe6b5b85ef2ed115f9fc2 100644 (file)
@@ -170,15 +170,12 @@ static int wsaud_read_packet(AVFormatContext *s,
         return AVERROR_INVALIDDATA;
 
     chunk_size = LE_16(&preamble[0]);
-    if (av_new_packet(pkt, chunk_size))
+    ret= av_get_packet(pb, pkt, chunk_size);
+    if (ret != chunk_size)
         return AVERROR_IO;
     pkt->stream_index = wsaud->audio_stream_index;
     pkt->pts = wsaud->audio_frame_counter;
     pkt->pts /= wsaud->audio_samplerate;
-    if ((ret = get_buffer(pb, pkt->data, chunk_size)) != chunk_size) {
-        av_free_packet(pkt);
-        ret = AVERROR_IO;
-    }
 
     /* 2 samples/byte, 1 or 2 samples per frame depending on stereo */
     wsaud->audio_frame_counter += (chunk_size * 2) / wsaud->audio_channels;
@@ -322,11 +319,8 @@ static int wsvqa_read_packet(AVFormatContext *s,
 
     if ((chunk_type == SND2_TAG) || (chunk_type == VQFR_TAG)) {
 
-        if (av_new_packet(pkt, chunk_size))
-            return AVERROR_IO;
-        ret = get_buffer(pb, pkt->data, chunk_size);
+        av_get_packet(pb, pkt, chunk_size);
         if (ret != chunk_size) {
-            av_free_packet(pkt);
             ret = AVERROR_IO;
         }
 
index 7aead7b056f58a1b9fad2f26688e99dd14a35ca3..74519fa1b663c354685afe81d909915bdcd6d624 100644 (file)
@@ -356,17 +356,11 @@ static int yuv4_read_packet(AVFormatContext *s, AVPacket *pkt)
     if (packet_size < 0)
         return -1;
 
-    if (av_new_packet(pkt, packet_size) < 0)
+    if (av_get_packet(&s->pb, pkt, packet_size) != packet_size)
         return AVERROR_IO;
 
     pkt->stream_index = 0;
-    ret = get_buffer(&s->pb, pkt->data, pkt->size);
-    if (ret != pkt->size) {
-        av_free_packet(pkt);
-        return AVERROR_IO;
-    } else {
-        return 0;
-    }
+    return 0;
 }
 
 static int yuv4_read_close(AVFormatContext *s)