[FFmpeg-cvslog] r16110 - in trunk/libavformat: rdt.c rm.h rmdec.c

rbultje subversion
Sat Dec 13 22:37:27 CET 2008


Author: rbultje
Date: Sat Dec 13 22:37:27 2008
New Revision: 16110

Log:
Don't access RMContext directly in rdt.c. Rather, use the return value of
ff_rm_parse_packet() to indicate whether more audio packets are available
in the demuxer from the last RM frame, and save that in the RDT parsing
context. See patch/discussion in "[PATCH] rdt.c: don't access RMContext"
on ML.



Modified:
   trunk/libavformat/rdt.c
   trunk/libavformat/rm.h
   trunk/libavformat/rmdec.c

Modified: trunk/libavformat/rdt.c
==============================================================================
--- trunk/libavformat/rdt.c	(original)
+++ trunk/libavformat/rdt.c	Sat Dec 13 22:37:27 2008
@@ -84,6 +84,7 @@ struct PayloadContext {
     uint8_t *mlti_data;
     unsigned int mlti_data_size;
     char buffer[RTP_MAX_PACKET_LENGTH + FF_INPUT_BUFFER_PADDING_SIZE];
+    int audio_pkt_cnt[MAX_STREAMS]; /**< remaining audio packets in rmdec */
 };
 
 void
@@ -294,9 +295,8 @@ rdt_parse_packet (PayloadContext *rdt, A
 {
     int seq = 1, res;
     ByteIOContext pb;
-    RMContext *rm = rdt->rmctx->priv_data;
 
-    if (rm->audio_pkt_cnt == 0) {
+    if (rdt->audio_pkt_cnt == 0) {
         int pos;
 
         init_put_byte(&pb, buf, len, 0, NULL, NULL, NULL, NULL);
@@ -306,7 +306,8 @@ rdt_parse_packet (PayloadContext *rdt, A
         pos = url_ftell(&pb);
         if (res < 0)
             return res;
-        if (rm->audio_pkt_cnt > 0 &&
+        rdt->audio_pkt_cnt[st->id] = res;
+        if (rdt->audio_pkt_cnt[st->id] > 0 &&
             st->codec->codec_id == CODEC_ID_AAC) {
             memcpy (rdt->buffer, buf + pos, len - pos);
             rdt->rmctx->pb = av_alloc_put_byte (rdt->buffer, len - pos, 0,
@@ -314,14 +315,14 @@ rdt_parse_packet (PayloadContext *rdt, A
         }
     } else {
         ff_rm_retrieve_cache (rdt->rmctx, rdt->rmctx->pb, st, pkt);
-        if (rm->audio_pkt_cnt == 0 &&
+        if (rdt->audio_pkt_cnt[st->id] == 0 &&
             st->codec->codec_id == CODEC_ID_AAC)
             av_freep(&rdt->rmctx->pb);
     }
     pkt->stream_index = st->index;
     pkt->pts = *timestamp;
 
-    return rm->audio_pkt_cnt > 0;
+    return rdt->audio_pkt_cnt[st->id] > 0;
 }
 
 int

Modified: trunk/libavformat/rm.h
==============================================================================
--- trunk/libavformat/rm.h	(original)
+++ trunk/libavformat/rm.h	Sat Dec 13 22:37:27 2008
@@ -93,7 +93,9 @@ int ff_rm_read_mdpr_codecdata (AVFormatC
  * @param flags pointer to an integer containing the packet flags, may be
                 updated
  * @param ts pointer to timestamp, may be updated
- * @return 0 on success, errno codes on error
+ * @return >=0 on success (where >0 indicates there are cached samples that
+ *         can be retrieved with subsequent calls to ff_rm_retrieve_cache()),
+ *         errno codes on error
  */
 int ff_rm_parse_packet (AVFormatContext *s, ByteIOContext *pb,
                         AVStream *st, int len,

Modified: trunk/libavformat/rmdec.c
==============================================================================
--- trunk/libavformat/rmdec.c	(original)
+++ trunk/libavformat/rmdec.c	Sat Dec 13 22:37:27 2008
@@ -644,7 +644,7 @@ ff_rm_parse_packet (AVFormatContext *s, 
     if (*flags & 2)
         pkt->flags |= PKT_FLAG_KEY;
 
-    return 0;
+    return st->codec->codec_type == CODEC_TYPE_AUDIO ? rm->audio_pkt_cnt : 0;
 }
 
 void




More information about the ffmpeg-cvslog mailing list