[FFmpeg-devel] [PATCH] http Transfer-Encoding chunked

Peter Holik peter
Mon Jun 1 19:46:25 CEST 2009


> On Mon, Jun 01, 2009 at 01:21:07PM +0200, Peter Holik wrote:
>> > On Mon, Jun 01, 2009 at 12:20:03PM +0200, Peter Holik wrote:
>> >> > On Wed, May 27, 2009 at 08:54:37AM +0200, Peter Holik wrote:
>> >> >> > Hi Peter,
>> >> >> >
>> >> >> > On Tue, May 26, 2009 at 3:20 PM, Peter Holik <peter at holik.at> wrote:
>> >> >> >> i used printf with DEBUG like i saw in http.c:
>> >> >> >>
>> >> >> >> process_line
>> >> >> >>
>> >> >> >> #ifdef DEBUG
>> >> >> >> ? ? ? ?printf("http_code=%d\n", s->http_code);
>> >> >> >> #endif
>> >> >> >>
>> >> >> >>
>> >> >> >> http_connect
>> >> >> >>
>> >> >> >> #ifdef DEBUG
>> >> >> >> ? ? ? ? ? ?printf("header='%s'\n", line);
>> >> >> >> #endif
>> >> >> >>
>> >> >> >>
>> >> >> >> why now use av_log?
>> >> >> >
>> >> >> > That's a good catch. These lines of code are rather old, and most
>> >> >> > likely predate the "forbidding" of printf(). They were not converted
>> >> >> > for the simple reason that the compilation doesn't fail because DEBUG
>> >> >> > is, by default, not included in CFLAGS. A separate patch which
>> >> >> > converts them to av_log() at debugging-level would be much
>> >> >> > appreciated. Alternatively, they could also be removed.
>> >> >> >
>> >> >>
>> >> > [...]
>> >> >> +            for(;;) {
>> >> >> +                ch = http_getc(s);
>> >> >> +                if (ch < 0)
>> >> >> +                    return 0;
>> >> >> +                if (ch == '\n') {
>> >> >> +                    /* process chunk size */
>> >> >> +                    if (q > line && q[-1] == '\r')
>> >> >> +                         q--;
>> >> >> +                    *q = '\0';
>> >> >> +                    /* skip CR LF from last chunk */
>> >> >> +                    if (!(*line)) continue;
>> >> >> +
>> >> >> +                    s->chunksize = strtoll(line, NULL, 16);
>> >> >> +
>> >> >> +                    av_log(NULL, AV_LOG_DEBUG, "Chunked encoding data size:
>> %"PRId64"'\n",
>> >> >> s->chunksize);
>> >> >> +
>> >> >> +                    if (!s->chunksize)
>> >> >> +                        return 0;
>> >> >> +                    break;
>> >> >> +                } else
>> >> >> +                    if ((q - line) < sizeof(line) - 1)
>> >> >> +                        *q++ = ch;
>> >> >> +            }
>> >> >
>> >> > looks like code duplication
>> >>
>> >> looks like, but it is not exactly the same.
>> >
>> > can it be factorized?
>>
>> maybe like this patch?
>
> factorizing http_get_line() out should be a seperate patch
>
>
> [...]
>> @@ -151,6 +152,30 @@ static int http_getc(HTTPContext *s)
>>      return *s->buf_ptr++;
>>  }
>>
>> +static int http_get_line(HTTPContext *s, char *line, int line_size)
>> +{
>> +    int ch;
>> +    char *q;
>> +
>> +    q = line;
>> +    for(;;) {
>> +        ch = http_getc(s);
>> +        if (ch < 0)
>> +            return AVERROR(EIO);
>> +        if (ch == '\n') {
>> +            /* process line */
>> +            if (q > line && q[-1] == '\r')
>> +                q--;
>> +            *q = '\0';
>> +
>> +            return 0;
>> +        } else {
>> +            if ((q - line) < line_size - 1)
>> +                *q++ = ch;
>> +        }
>> +    }
>> +}
>> +
>>  static int process_line(URLContext *h, char *line, int line_count,
>>                          int *new_location)
>>  {
> [...]
>> @@ -251,30 +279,18 @@ static int http_connect(URLContext *h, const char *path, const char
>> *hoststr,
>>      }
>>
>>      /* wait for header */
>> -    q = line;
>>      for(;;) {
>> -        ch = http_getc(s);
>> -        if (ch < 0)
>> +        if (http_get_line(s, line, sizeof(line)) < 0)
>>              return AVERROR(EIO);
>> -        if (ch == '\n') {
>> -            /* process line */
>> -            if (q > line && q[-1] == '\r')
>> -                q--;
>> -            *q = '\0';
>> -#ifdef DEBUG
>> -            printf("header='%s'\n", line);
>> -#endif
>> -            err = process_line(h, line, s->line_count, new_location);
>> -            if (err < 0)
>> -                return err;
>> -            if (err == 0)
>> -                break;
>> -            s->line_count++;
>> -            q = line;
>> -        } else {
>> -            if ((q - line) < sizeof(line) - 1)
>> -                *q++ = ch;
>> -        }
>> +
>> +        av_log(NULL, AV_LOG_DEBUG, "http header='%s'\n", line);
>> +
>> +        err = process_line(h, line, s->line_count, new_location);
>> +        if (err < 0)
>> +            return err;
>> +        if (err == 0)
>> +            break;
>> +        s->line_count++;
>>      }
>>
>>      return (off == s->off) ? 0 : -1;

now every little bit is separated

cu Peter



More information about the ffmpeg-devel mailing list