Mercurial > libavformat.hg
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) |