[FFmpeg-soc] [soc]:?r2021?-?in?eac3:?ac3dec.h?ac3dec_data.c?ac3dec_data.h?eac3dec .c
Michael Niedermayer
michaelni at gmx.at
Fri Apr 4 01:45:44 CEST 2008
On Thu, Apr 03, 2008 at 11:53:22PM +0200, Bartlomiej Wolowiec wrote:
> On niedziela, 30 marca 2008, Michael Niedermayer wrote:
> > Note, to add the header into the buffer calling ff_combine_frame() with
> > END_NOT_FOUND and a smaller buffer size should work.
> >
> > After its in the buffer you just run the header decoder thing over the
> > header and when you know the final frame size you call ff_combine_frame
> > with appropriate next value.
> >
> > Anyway iam not insisting on you changing the current aac/ac3 parser to use
> > ff_combine_frame()
> > But what you will end up implementing will be quite similar in
> > functionality to ff_combine_frame()
> >
> > [...]
>
> Hmm...
> I tried to implement it using ff_combine_frame, but the code which I got is
> in my opinion significantly worse. Main problems which I had:
> -ff_combine_frame is rather adapted to using on one frame, when in buffer is
> one frame and it currently reads the next one it isn't convenient (the whole
> buffer size is not just a new frame's size, so that we should remember size
> of earlier frames).
> -in the genuine code there is
> memmove(s->frame_start, s->frame_start + 1, s->header_size - 1);
> s->frame_ptr--;
> here we can operate on pc->buffer and pc->index (remembering also where the
> new frame begins). However, surely it isn't the simpliest solution...
What i had in mind is below, this is blindly written and likely contains bugs.
I did spot one each time i looked at it :)
But it does not look fundamentally worse to me, it also has the advantage that
its not full of unneeded memcpys and memmoves.
while(s->remaining_size <= buf_size){
if(s->remaining_size && !s->need_next_header){
i= s->remaining_size;
s->remaining_size= 0;
goto output_frame;
}else{ //we need a header first
for(i=s->remaining_size; i<buf_size; i++){
ctx->state= (ctx->state<<8) + buf[i];
if((len=parse_header(ctx->state, &s->need_next_header, &s->new_frame_start)))
break;
}
i-= header_size;
if(len>0){
s->remaining_size= len + i;
if(pc->index+i > 0 && s->new_frame_start){
s->remaining_size -= i; // remaining_size=len
output_frame:
ff_combine_frame(pc, i, &buf, &buf_size);
*poutbuf = buf;
*poutbuf_size = buf_size;
return i;
}
}else{
break;
}
}
}
ff_combine_frame(pc, END_NOT_FOUND, &buf, &buf_size);
s->remaining_size -= FFMIN(s->remaining_size, buf_size);
*poutbuf = NULL;
*poutbuf_size = 0;
return buf_size;
> Because of that I don't know what to do:
> -leave the code as it is,
> -use ff_combine_frame,
> -write new functions which will operate on the buffer (similar to
> ff_combine_frame, but adapted to the needs of aac_ac3_parser)?
Do what is simplest and fastest.
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Freedom in capitalist society always remains about the same as it was in
ancient Greek republics: Freedom for slave owners. -- Vladimir Lenin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-soc/attachments/20080404/f9e2d52b/attachment.pgp>
More information about the FFmpeg-soc
mailing list