> > 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