On Fri, Oct 19, 2012 at 8:04 PM, Luca Barbato <lu_z...@gentoo.org> wrote:
> On 10/19/2012 06:42 PM, Reinhard Tartler wrote:
>> On Wed, Oct 17, 2012 at 11:46 PM, Reinhard Tartler <siret...@gmail.com> 
>> wrote:
>>> On Wed, Oct 17, 2012 at 11:32 PM, Måns Rullgård <m...@mansr.com> wrote:
>>>> Reinhard Tartler <siret...@tauware.de> writes:
>>>>
>>>>> From: Michael Niedermayer <michae...@gmx.at>
>>>>>
>>>>> Fixes Ticket1718
>>>>>
>>>>> Signed-off-by: Michael Niedermayer <michae...@gmx.at>
>>>>> (cherry picked from commit 93b240f4a59348c07d3d7e4862227f6949c51e14)
>>>>>
>>>>> Signed-off-by: Reinhard Tartler <siret...@tauware.de>
>>>>> ---
>>>>>  libavcodec/mpegaudio_parser.c |    1 +
>>>>>  1 file changed, 1 insertion(+)
>>>>>
>>>>> diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c
>>>>> index c904873..4166f3f 100644
>>>>> --- a/libavcodec/mpegaudio_parser.c
>>>>> +++ b/libavcodec/mpegaudio_parser.c
>>>>> @@ -54,6 +54,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
>>>>>              int inc= FFMIN(buf_size - i, s->frame_size);
>>>>>              i += inc;
>>>>>              s->frame_size -= inc;
>>>>> +            state = 0;
>>>>>
>>>>>              if(!s->frame_size){
>>>>>                  next= i;
>
> Big picture:
>
>     uint32_t state= pc->state;
>     int i;
>     int next= END_NOT_FOUND;
>
>     for(i=0; i<buf_size; ){
>         if(s->frame_size){
>             int inc= FFMIN(buf_size - i, s->frame_size);
>             i += inc;
>             s->frame_size -= inc;
>
>             if(!s->frame_size){
>                 next= i;
>                 break;
>
>         break;
>             }
>         }else{
>             while(i<buf_size){
>                 int ret, sr, channels, bit_rate, frame_size;
>
>                 state= (state<<8) + buf[i++];
>
>         ...
>
> in libavcodec/parser.c
>
> s = av_mallocz(sizeof(AVCodecParserContext));
>
> So the state starts 0, in the file then it gets
>
> the value set and so on. Nothing random here at all.
>
> "state" is fed to the header parser, so basically the patch proposes to
> reset it when you have a frame so you start afresh, the patch doesn't
> seem wrong, not sure if setting it on the !s->frame_size branch is more
> correct since I hadn't read the whole code, surely not using the
> previous buffer tail sounds correct.
>
> Here if you want to have a better look on more samples.
>
> diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c
> index c904873..e9eee1f 100644
> --- a/libavcodec/mpegaudio_parser.c
> +++ b/libavcodec/mpegaudio_parser.c
> @@ -49,13 +49,19 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
>      int i;
>      int next= END_NOT_FOUND;
>
> +    av_log(NULL, AV_LOG_INFO, "state start %d\n", state);
> +
>      for(i=0; i<buf_size; ){
>          if(s->frame_size){
>              int inc= FFMIN(buf_size - i, s->frame_size);
>              i += inc;
>              s->frame_size -= inc;
> +            state = 0;
> +
> +            av_log(NULL, AV_LOG_INFO, "state %d\n", state);
>
>              if(!s->frame_size){
> +                state = 0;
>                  next= i;
>                  break;
>              }
> @@ -87,7 +93,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
>              }
>          }
>      }
> -
> +    av_log(NULL, AV_LOG_INFO, "state end %d\n", state);
>      pc->state= state;
>      if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
>          *poutbuf = NULL;

I believe the av_log could also b made AV_LOG_DEBUG. So, how about
taking Luca's patch with a commit message along the lines:

mpegaudio_parser: reset parsing context state on new frames


?
-- 
regards,
    Reinhard
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to