[FFmpeg-cvslog] r24242 - trunk/libavformat/oggenc.c
bcoudurier
subversion
Thu Jul 15 01:21:20 CEST 2010
Author: bcoudurier
Date: Thu Jul 15 01:21:18 2010
New Revision: 24242
Log:
In ogg muxer, use dyn buffer to compute crc of the page, fix muxing with pipe
when page buffer is bigger than default buffer size. Max page is 65k.
Modified:
trunk/libavformat/oggenc.c
Modified: trunk/libavformat/oggenc.c
==============================================================================
--- trunk/libavformat/oggenc.c Wed Jul 14 23:22:06 2010 (r24241)
+++ trunk/libavformat/oggenc.c Thu Jul 15 01:21:18 2010 (r24242)
@@ -63,36 +63,50 @@ typedef struct {
OGGPageList *page_list;
} OGGContext;
-static void ogg_update_checksum(AVFormatContext *s, int64_t crc_offset)
+static void ogg_update_checksum(AVFormatContext *s, ByteIOContext *pb, int64_t crc_offset)
{
- int64_t pos = url_ftell(s->pb);
- uint32_t checksum = get_checksum(s->pb);
- url_fseek(s->pb, crc_offset, SEEK_SET);
- put_be32(s->pb, checksum);
- url_fseek(s->pb, pos, SEEK_SET);
+ int64_t pos = url_ftell(pb);
+ uint32_t checksum = get_checksum(pb);
+ url_fseek(pb, crc_offset, SEEK_SET);
+ put_be32(pb, checksum);
+ url_fseek(pb, pos, SEEK_SET);
}
-static void ogg_write_page(AVFormatContext *s, OGGPage *page, int extra_flags)
+static int ogg_write_page(AVFormatContext *s, OGGPage *page, int extra_flags)
{
OGGStreamContext *oggstream = s->streams[page->stream_index]->priv_data;
+ ByteIOContext *pb;
int64_t crc_offset;
+ int ret, size;
+ uint8_t *buf;
- init_checksum(s->pb, ff_crc04C11DB7_update, 0);
- put_tag(s->pb, "OggS");
- put_byte(s->pb, 0);
- put_byte(s->pb, page->flags | extra_flags);
- put_le64(s->pb, page->granule);
- put_le32(s->pb, oggstream->serial_num);
- put_le32(s->pb, oggstream->page_counter++);
- crc_offset = url_ftell(s->pb);
- put_le32(s->pb, 0); // crc
- put_byte(s->pb, page->segments_count);
- put_buffer(s->pb, page->segments, page->segments_count);
- put_buffer(s->pb, page->data, page->size);
+ ret = url_open_dyn_buf(&pb);
+ if (ret < 0)
+ return ret;
+ init_checksum(pb, ff_crc04C11DB7_update, 0);
+ put_tag(pb, "OggS");
+ put_byte(pb, 0);
+ put_byte(pb, page->flags | extra_flags);
+ put_le64(pb, page->granule);
+ put_le32(pb, oggstream->serial_num);
+ put_le32(pb, oggstream->page_counter++);
+ crc_offset = url_ftell(pb);
+ put_le32(pb, 0); // crc
+ put_byte(pb, page->segments_count);
+ put_buffer(pb, page->segments, page->segments_count);
+ put_buffer(pb, page->data, page->size);
- ogg_update_checksum(s, crc_offset);
+ ogg_update_checksum(s, pb, crc_offset);
+ put_flush_packet(pb);
+
+ size = url_close_dyn_buf(pb, &buf);
+ if (size < 0)
+ return size;
+
+ put_buffer(s->pb, buf, size);
put_flush_packet(s->pb);
oggstream->page_count--;
+ return 0;
}
static int64_t ogg_granule_to_timestamp(OGGStreamContext *oggstream, OGGPage *page)
More information about the ffmpeg-cvslog
mailing list