[FFmpeg-cvslog] r13097 - trunk/libavformat/iff.c

superdump subversion
Fri May 9 13:25:27 CEST 2008


Author: superdump
Date: Fri May  9 13:25:27 2008
New Revision: 13097

Log:
IFF stereo support

Patch by Jai Menon ( realityman gmx net )


Modified:
   trunk/libavformat/iff.c

Modified: trunk/libavformat/iff.c
==============================================================================
--- trunk/libavformat/iff.c	(original)
+++ trunk/libavformat/iff.c	Fri May  9 13:25:27 2008
@@ -60,6 +60,19 @@ typedef struct {
     uint32_t  audio_frame_count;
 } IffDemuxContext;
 
+
+static void interleave_stereo(const uint8_t *src, uint8_t *dest, int size)
+{
+    uint8_t *end = dest + size;
+    size = size>>1;
+
+    while(dest < end) {
+        *dest++ = *src;
+        *dest++ = *(src+size);
+        src++;
+    }
+}
+
 static int iff_probe(AVProbeData *p)
 {
     const uint8_t *d = p->buf;
@@ -152,7 +165,20 @@ static int iff_read_packet(AVFormatConte
 
     if(iff->sent_bytes > iff->body_size)
         return AVERROR(EIO);
-    ret = av_get_packet(pb, pkt, PACKET_SIZE);
+
+    if(s->streams[0]->codec->channels == 2) {
+        uint8_t sample_buffer[PACKET_SIZE];
+
+        ret = get_buffer(pb, sample_buffer, PACKET_SIZE);
+        if(av_new_packet(pkt, PACKET_SIZE) < 0) {
+            av_log(s, AV_LOG_ERROR, "iff: cannot allocate packet \n");
+            return AVERROR(ENOMEM);
+        }
+        interleave_stereo(sample_buffer, pkt->data, PACKET_SIZE);
+    }
+    else {
+        ret = av_get_packet(pb, pkt, PACKET_SIZE);
+    }
 
     if(iff->sent_bytes == 0)
         pkt->flags |= PKT_FLAG_KEY;




More information about the ffmpeg-cvslog mailing list