> > 3.change of ff_aac_ac3_parse to make it react correctly to result
> > returned in flag.

According to suggestions, I wrote new patch to  AAC/AC3 parser.

Current data about the stream are taken from frames FRAME_START and 
FRAME_COMPLETE. It will be improved in the next patch.
-- 
Bartlomiej Wolowiec
Index: libavcodec/aac_ac3_parser.c
===================================================================
--- libavcodec/aac_ac3_parser.c	(wersja 12623)
+++ libavcodec/aac_ac3_parser.c	(kopia robocza)
@@ -29,35 +29,50 @@
                      const uint8_t *buf, int buf_size)
 {
     AACAC3ParseContext *s = s1->priv_data;
-    AACAC3FrameFlag frame_flag;
     const uint8_t *buf_ptr;
     int len;
 
     *poutbuf = NULL;
     *poutbuf_size = 0;
 
+    if(s->frame_ptr == NULL) {
+        //after sending package of data in the end there was one new header
+        memcpy(s->inbuf, s->frame_start, s->header_size);
+        s->frame_start = s->inbuf;
+        s->frame_ptr = s->frame_start + s->header_size;
+    }
+
     buf_ptr = buf;
     while (buf_size > 0) {
         int size_needed= s->frame_size ? s->frame_size : s->header_size;
-        len = s->inbuf_ptr - s->inbuf;
+        len = s->frame_ptr - s->frame_start;
 
         if(len<size_needed){
             len = FFMIN(size_needed - len, buf_size);
-            memcpy(s->inbuf_ptr, buf_ptr, len);
+            memcpy(s->frame_ptr, buf_ptr, len);
             buf_ptr      += len;
-            s->inbuf_ptr += len;
+            s->frame_ptr += len;
             buf_size     -= len;
         }
 
         if (s->frame_size == 0) {
-            if ((s->inbuf_ptr - s->inbuf) == s->header_size) {
-                len = s->sync(s, &frame_flag);
+            if ((s->frame_ptr - s->frame_start) == s->header_size) {
+                len = s->sync(s, &s->frame_flag);
                 if (len == 0) {
                     /* no sync found : move by one byte (inefficient, but simple!) */
-                    memmove(s->inbuf, s->inbuf + 1, s->header_size - 1);
-                    s->inbuf_ptr--;
+                    memmove(s->frame_start, s->frame_start + 1, s->header_size - 1);
+                    s->frame_ptr--;
                 } else {
                     s->frame_size = len;
+                    if(s->frame_flag == FRAME_START || s->frame_flag == FRAME_COMPLETE) {
+                        if(s->frame_start != s->inbuf){
+                            //in buffer there is frame which is ready to send
+                            *poutbuf = s->inbuf;
+                            *poutbuf_size = s->frame_start - s->inbuf;
+                            s->frame_ptr = NULL;
+                            s->frame_size = 0;
+                            break;
+                        }
                     /* update codec info */
                     avctx->sample_rate = s->sample_rate;
                     /* allow downmixing to stereo (or mono for AC3) */
@@ -72,15 +87,21 @@
                     }
                     avctx->bit_rate = s->bit_rate;
                     avctx->frame_size = s->samples;
+                    }
                 }
             }
         } else {
-            if(s->inbuf_ptr - s->inbuf == s->frame_size){
+            if(s->frame_ptr - s->frame_start == s->frame_size){
+                s->frame_start = s->frame_ptr;
+                s->frame_size = 0;
+
+                if(s->frame_flag == FRAME_COMPLETE) {
                 *poutbuf = s->inbuf;
                 *poutbuf_size = s->frame_size;
-                s->inbuf_ptr = s->inbuf;
-                s->frame_size = 0;
+                s->frame_start = s->inbuf;
+                s->frame_ptr = s->frame_start;
                 break;
+                }
             }
         }
     }
Index: libavcodec/aac_ac3_parser.h
===================================================================
--- libavcodec/aac_ac3_parser.h	(wersja 12623)
+++ libavcodec/aac_ac3_parser.h	(kopia robocza)
@@ -33,7 +33,8 @@
 }AACAC3FrameFlag;
 
 typedef struct AACAC3ParseContext {
-    uint8_t *inbuf_ptr;
+    uint8_t *frame_ptr;
+    uint8_t *frame_start;
     int frame_size;
     int header_size;
     int (*sync)(struct AACAC3ParseContext *hdr_info, AACAC3FrameFlag *flag);
@@ -43,6 +44,7 @@
     int sample_rate;
     int bit_rate;
     int samples;
+    AACAC3FrameFlag frame_flag;
 } AACAC3ParseContext;
 
 int ff_aac_ac3_parse(AVCodecParserContext *s1,
Index: libavcodec/aac_parser.c
===================================================================
--- libavcodec/aac_parser.c	(wersja 12623)
+++ libavcodec/aac_parser.c	(kopia robocza)
@@ -43,7 +43,7 @@
     GetBitContext bits;
     int size, rdb, ch, sr;
 
-    init_get_bits(&bits, hdr_info->inbuf, AAC_HEADER_SIZE * 8);
+    init_get_bits(&bits, hdr_info->frame_start, AAC_HEADER_SIZE * 8);
 
     if(get_bits(&bits, 12) != 0xfff)
         return 0;
@@ -84,7 +84,8 @@
 static av_cold int aac_parse_init(AVCodecParserContext *s1)
 {
     AACAC3ParseContext *s = s1->priv_data;
-    s->inbuf_ptr = s->inbuf;
+    s->frame_start = s->inbuf;
+    s->frame_ptr = s->frame_start;
     s->header_size = AAC_HEADER_SIZE;
     s->sync = aac_sync;
     return 0;
Index: libavcodec/ac3_parser.c
===================================================================
--- libavcodec/ac3_parser.c	(wersja 12623)
+++ libavcodec/ac3_parser.c	(kopia robocza)
@@ -128,7 +128,7 @@
     int err;
     AC3HeaderInfo hdr;
 
-    err = ff_ac3_parse_header(hdr_info->inbuf, &hdr);
+    err = ff_ac3_parse_header(hdr_info->frame_start, &hdr);
 
     if(err < 0)
         return 0;
@@ -155,7 +155,8 @@
 static av_cold int ac3_parse_init(AVCodecParserContext *s1)
 {
     AACAC3ParseContext *s = s1->priv_data;
-    s->inbuf_ptr = s->inbuf;
+    s->frame_start = s->inbuf;
+    s->frame_ptr = s->frame_start;
     s->header_size = AC3_HEADER_SIZE;
     s->sync = ac3_sync;
     return 0;
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc

Reply via email to