@ -20,6 +20,7 @@
*/
# include "libavutil/crc.h"
# include "libavutil/opt.h"
# include "libavutil/random_seed.h"
# include "libavcodec/xiph.h"
# include "libavcodec/bytestream.h"
@ -62,9 +63,26 @@ typedef struct OGGPageList {
} OGGPageList ;
typedef struct {
const AVClass * class ;
OGGPageList * page_list ;
int pref_size ; ///< preferred page size (0 => fill all segments)
} OGGContext ;
static const AVOption options [ ] = {
{ " oggpagesize " , " Set preferred Ogg page size. " ,
offsetof ( OGGContext , pref_size ) , FF_OPT_TYPE_INT , 0 , 0 , MAX_PAGE_SIZE , AV_OPT_FLAG_ENCODING_PARAM } ,
{ NULL } ,
} ;
static const AVClass ogg_muxer_class = {
" Ogg muxer " ,
av_default_item_name ,
options ,
LIBAVUTIL_VERSION_INT ,
} ;
static void ogg_update_checksum ( AVFormatContext * s , AVIOContext * pb , int64_t crc_offset )
{
int64_t pos = avio_tell ( pb ) ;
@ -174,6 +192,7 @@ static int ogg_buffer_data(AVFormatContext *s, AVStream *st,
uint8_t * data , unsigned size , int64_t granule )
{
OGGStreamContext * oggstream = st - > priv_data ;
OGGContext * ogg = s - > priv_data ;
int total_segments = size / 255 + 1 ;
uint8_t * p = data ;
int i , segments , len , flush = 0 ;
@ -209,8 +228,9 @@ static int ogg_buffer_data(AVFormatContext *s, AVStream *st,
if ( i = = total_segments )
page - > granule = granule ;
if ( page - > segments_count = = 255 ) {
ogg_buffer_page ( s , oggstream ) ;
if ( page - > segments_count = = 255 | |
( ogg - > pref_size > 0 & & page - > size > = ogg - > pref_size ) ) {
ogg_buffer_page ( s , oggstream ) ;
}
}
@ -514,4 +534,5 @@ AVOutputFormat ff_ogg_muxer = {
ogg_write_header ,
ogg_write_packet ,
ogg_write_trailer ,
. priv_class = & ogg_muxer_class ,
} ;