[FFmpeg-devel] [PATCH] http Transfer-Encoding chunked
Peter Holik
peter
Sat Jun 6 17:29:57 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
ping
cu Peter
More information about the ffmpeg-devel
mailing list