comparison oggenc.c @ 6260:5c17c20dd67a libavformat

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.
author bcoudurier
date Wed, 14 Jul 2010 23:21:18 +0000
parents a198eb01f895
children f4f55ad4a603
comparison
equal deleted inserted replaced
6259:7b2f50760dfb 6260:5c17c20dd67a
61 61
62 typedef struct { 62 typedef struct {
63 OGGPageList *page_list; 63 OGGPageList *page_list;
64 } OGGContext; 64 } OGGContext;
65 65
66 static void ogg_update_checksum(AVFormatContext *s, int64_t crc_offset) 66 static void ogg_update_checksum(AVFormatContext *s, ByteIOContext *pb, int64_t crc_offset)
67 { 67 {
68 int64_t pos = url_ftell(s->pb); 68 int64_t pos = url_ftell(pb);
69 uint32_t checksum = get_checksum(s->pb); 69 uint32_t checksum = get_checksum(pb);
70 url_fseek(s->pb, crc_offset, SEEK_SET); 70 url_fseek(pb, crc_offset, SEEK_SET);
71 put_be32(s->pb, checksum); 71 put_be32(pb, checksum);
72 url_fseek(s->pb, pos, SEEK_SET); 72 url_fseek(pb, pos, SEEK_SET);
73 } 73 }
74 74
75 static void ogg_write_page(AVFormatContext *s, OGGPage *page, int extra_flags) 75 static int ogg_write_page(AVFormatContext *s, OGGPage *page, int extra_flags)
76 { 76 {
77 OGGStreamContext *oggstream = s->streams[page->stream_index]->priv_data; 77 OGGStreamContext *oggstream = s->streams[page->stream_index]->priv_data;
78 ByteIOContext *pb;
78 int64_t crc_offset; 79 int64_t crc_offset;
79 80 int ret, size;
80 init_checksum(s->pb, ff_crc04C11DB7_update, 0); 81 uint8_t *buf;
81 put_tag(s->pb, "OggS"); 82
82 put_byte(s->pb, 0); 83 ret = url_open_dyn_buf(&pb);
83 put_byte(s->pb, page->flags | extra_flags); 84 if (ret < 0)
84 put_le64(s->pb, page->granule); 85 return ret;
85 put_le32(s->pb, oggstream->serial_num); 86 init_checksum(pb, ff_crc04C11DB7_update, 0);
86 put_le32(s->pb, oggstream->page_counter++); 87 put_tag(pb, "OggS");
87 crc_offset = url_ftell(s->pb); 88 put_byte(pb, 0);
88 put_le32(s->pb, 0); // crc 89 put_byte(pb, page->flags | extra_flags);
89 put_byte(s->pb, page->segments_count); 90 put_le64(pb, page->granule);
90 put_buffer(s->pb, page->segments, page->segments_count); 91 put_le32(pb, oggstream->serial_num);
91 put_buffer(s->pb, page->data, page->size); 92 put_le32(pb, oggstream->page_counter++);
92 93 crc_offset = url_ftell(pb);
93 ogg_update_checksum(s, crc_offset); 94 put_le32(pb, 0); // crc
95 put_byte(pb, page->segments_count);
96 put_buffer(pb, page->segments, page->segments_count);
97 put_buffer(pb, page->data, page->size);
98
99 ogg_update_checksum(s, pb, crc_offset);
100 put_flush_packet(pb);
101
102 size = url_close_dyn_buf(pb, &buf);
103 if (size < 0)
104 return size;
105
106 put_buffer(s->pb, buf, size);
94 put_flush_packet(s->pb); 107 put_flush_packet(s->pb);
95 oggstream->page_count--; 108 oggstream->page_count--;
109 return 0;
96 } 110 }
97 111
98 static int64_t ogg_granule_to_timestamp(OGGStreamContext *oggstream, OGGPage *page) 112 static int64_t ogg_granule_to_timestamp(OGGStreamContext *oggstream, OGGPage *page)
99 { 113 {
100 if (oggstream->kfgshift) 114 if (oggstream->kfgshift)