[FFmpeg-devel] [PATCH] MMS protocol support patch 1
Michael Niedermayer
michaelni
Wed Oct 10 04:09:56 CEST 2007
Hi
On Tue, Oct 09, 2007 at 02:00:25PM +0200, Bj?rn Axelsson wrote:
[...]
> I have also fixed the issues mentioned by Diego earlier in this thread
> (some trailing whitespace and many long lines).
>
> Attached patches:
> 1. aviobuf_resetbuf.diff: add functionality to set the direction of a
> ByteIOContext buffer.
> 2. mms_protocol_base.diff: basic mmsh protocol support
> 3. mms_seek_hack.diff: Add MMS seek and pause support to the ASF
> demuxer.
>
> Thanks to Neil Brown for suggesting using quilt for patch management,
> and to Michael for taking his time for the review.
[...]
(1. aviobuf_resetbuf.diff)
patch ok
[...]
> @@ -105,6 +107,16 @@
> }
> #endif
>
> +#if (defined CONFIG_MMSH_PROTOCOL)
#ifdef
[...]
> + /** @name Outgoing Control Buffer
> + * Buffer for building outgoing MMST packets. */
> + /*@{*/
> + ByteIOContext outgoing_packet_data; ///< packet stream
> + uint8_t outgoing_packet_buffer[MMS_MAXIMUM_PACKET_LENGTH]; ///< packet data
> + /*@}*/
unused
> +
> + /** @name Incoming Control Buffer
> + * Buffer for incoming control packets. */
> + /*@{*/
> + uint8_t incoming_buffer[8*1024];///< Incoming buffer location.
> + int incoming_buffer_length; ///< Incoming buffer length.
> + /*@}*/
unused
[...]
> +extern MMSProtocol mmst_mmsprotocol, mmsh_mmsprotocol;
first is unused
[...]
> +extern URLProtocol mmst_protocol;
unused
[...]
> + int done = 0;
> +
> + while(!done) {
> + int ch = get_byte(context);
> + if(url_feof(context) || ch == '\n') {
> + done = 1;
> + } else if(ch == '\r') {
> + /* eat it. */
> + } else if(dst-buffer < max_size-1) {
> + *dst++ = ch;
> + }
> + }
for(;;){
...
if(...)
break;
...
}
[...]
> + *chunk_type = get_le16(&mms->incoming_io_buffer);
> + *chunk_length = get_le16(&mms->incoming_io_buffer);
nitpick:
*chunk_type = get_le16(&mms->incoming_io_buffer);
*chunk_length = get_le16(&mms->incoming_io_buffer);
[...]
> + } else if(chunk_type == CHUNK_TYPE_HTTP_HEADER_START &&
> + chunk_length == CHUNK_TYPE_HTTP_HEADER_SECOND) {
} else if(chunk_type == CHUNK_TYPE_HTTP_HEADER_START &&
chunk_length == CHUNK_TYPE_HTTP_HEADER_SECOND ) {
[...]
> + if(http_code>=200 && http_code<300) {
> + if(mms->state == AWAITING_PAUSE_ACKNOWLEDGE) {
> + packet_type = SC_PACKET_STREAM_STOPPED_TYPE;
> + }
> + } else if(http_code>=300 && http_code<400) {
> + av_log(mms, AV_LOG_ERROR,
> + "3xx redirection not implemented: %d %s\n",
> + http_code, http_status);
> + return SC_PACKET_TYPE_ERROR;
> + } else if(http_code != 200) {
how can it be 200 here? if it cant, why check ...
> + av_log(mms, AV_LOG_ERROR, "%d %s\n", http_code, http_status);
> + return SC_PACKET_TYPE_ERROR;
> + }
> + } else {
> + av_log(mms, AV_LOG_ERROR, "Bad HTTP response: %s\n", line);
> + return SC_PACKET_TYPE_ERROR;
> + }
> + } else if((match = matches(line, "Content-Type: ")) != 0) {
> + strncpy(content_type, match, sizeof(content_type));
av_strlcpy() is safer i think ...
[...]
> + if((features = matches_anywhere(match, "client-id=")) != 0) {
> + char id[64];
> + const char *src = features;
> + char *dst = id;
> +
> + while(*src && *src !=',' && (src-features<sizeof(id)-1))
> + *dst++ = *src++;
> + *dst = '\0';
> +
> + mms->http_client_id = atoi(id);
why that copy before atoi() ?
[...]
> + exact_length = strlen(outgoing_buffer);
> + write_result = url_write(mms->mms_hd, outgoing_buffer, exact_length);
> + av_log(mms, AV_LOG_DEBUG, "Sent header request:\n%s", outgoing_buffer);
> + if(write_result != exact_length) {
> + av_log(mms, AV_LOG_ERROR, "write failed, %d != %d\n",
> + write_result, exact_length);
> + ff_mms_set_state(mms, STATE_ERROR);
> + if(write_result >= 0)
> + write_result = AVERROR(EIO);
> + } else
> + ff_mms_set_state(mms, AWAITING_ASF_HEADER);
> + return write_result;
> +}
[...]
> + exact_length = strlen(outgoing_buffer);
> + write_result = url_write(mms->mms_hd, outgoing_buffer, exact_length);
> + if(write_result != exact_length) {
> + av_log(mms, AV_LOG_ERROR, "write failed, %d != %d\n",
> + write_result, exact_length);
> + ff_mms_set_state(mms, STATE_ERROR);
> + if(write_result >= 0)
> + write_result = AVERROR(EIO);
> + } else
> + ff_mms_set_state(mms, AWAITING_HTTP_PAUSE_CONTROL_ACKNOWLEDGE);
> +
> + return write_result;
> +}
duplicate
[...]
> +/* Context stuff for logging */
> +static const char *mmscontext_to_name(void *ptr)
not doxygen compatible
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Opposition brings concord. Out of discord comes the fairest harmony.
-- Heraclitus
-------------- 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-devel/attachments/20071010/99eb0f0b/attachment.pgp>
More information about the ffmpeg-devel
mailing list