static int ogg_write_header(AVFormatContext *avfcontext) { OggContext *context = avfcontext->priv_data; AVCodecContext *avccontext ; vorbis_info vi ; vorbis_dsp_state vd ; vorbis_comment vc ; vorbis_block vb ; ogg_packet header, header_comm, header_code ; int n ; srand(time(NULL)); ogg_stream_init(&context->os, rand()); for(n = 0 ; n < avfcontext->nb_streams ; n++) { avccontext = &avfcontext->streams[n]->codec ; /* begin vorbis specific code */ vorbis_info_init(&vi) ; /* code copied from libavcodec/oggvorbis.c */ if(oggvorbis_init_encoder(&vi, avccontext) < 0) { fprintf(stderr, "ogg_write_header: init_encoder failed") ; return -1 ; } vorbis_analysis_init(&vd, &vi) ; vorbis_block_init(&vd, &vb) ; vorbis_comment_init(&vc) ; vorbis_comment_add_tag(&vc, "encoder", "ffmpeg") ; if(*avfcontext->title) vorbis_comment_add_tag(&vc, "title", avfcontext->title) ; vorbis_analysis_headerout(&vd, &vc, &header, &header_comm, &header_code) ; ogg_stream_packetin(&context->os, &header) ; ogg_stream_packetin(&context->os, &header_comm) ; ogg_stream_packetin(&context->os, &header_code) ; vorbis_block_clear(&vb) ; vorbis_dsp_clear(&vd) ; vorbis_info_clear(&vi) ; vorbis_comment_clear(&vc) ; /* end of vorbis specific code */ context->header_handled = 0 ; context->base_packet_no = 0 ; } return 0 ; }
static av_cold int oggvorbis_encode_init(AVCodecContext *avccontext) { OggVorbisContext *context = avccontext->priv_data ; ogg_packet header, header_comm, header_code; uint8_t *p; unsigned int offset, len; vorbis_info_init(&context->vi) ; if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) { av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed") ; return -1 ; } vorbis_analysis_init(&context->vd, &context->vi) ; vorbis_block_init(&context->vd, &context->vb) ; vorbis_comment_init(&context->vc); vorbis_comment_add_tag(&context->vc, "encoder", LIBAVCODEC_IDENT) ; vorbis_analysis_headerout(&context->vd, &context->vc, &header, &header_comm, &header_code); len = header.bytes + header_comm.bytes + header_code.bytes; avccontext->extradata_size= 64 + len + len/255; p = avccontext->extradata= av_mallocz(avccontext->extradata_size); p[0] = 2; offset = 1; offset += av_xiphlacing(&p[offset], header.bytes); offset += av_xiphlacing(&p[offset], header_comm.bytes); memcpy(&p[offset], header.packet, header.bytes); offset += header.bytes; memcpy(&p[offset], header_comm.packet, header_comm.bytes); offset += header_comm.bytes; memcpy(&p[offset], header_code.packet, header_code.bytes); offset += header_code.bytes; avccontext->extradata_size = offset; avccontext->extradata= av_realloc(avccontext->extradata, avccontext->extradata_size); /* vorbis_block_clear(&context->vb); vorbis_dsp_clear(&context->vd); vorbis_info_clear(&context->vi);*/ vorbis_comment_clear(&context->vc); avccontext->frame_size = OGGVORBIS_FRAME_SIZE ; avccontext->coded_frame= avcodec_alloc_frame(); avccontext->coded_frame->key_frame= 1; return 0 ; }
static int oggvorbis_encode_init(AVCodecContext *avccontext) { OggVorbisContext *context = avccontext->priv_data ; ogg_packet header, header_comm, header_code; uint8_t *p; vorbis_info_init(&context->vi) ; if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) { av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed") ; return -1 ; } vorbis_analysis_init(&context->vd, &context->vi) ; vorbis_block_init(&context->vd, &context->vb) ; vorbis_comment_init(&context->vc); vorbis_comment_add_tag(&context->vc, "encoder", LIBAVCODEC_IDENT) ; vorbis_analysis_headerout(&context->vd, &context->vc, &header, &header_comm, &header_code); avccontext->extradata_size= 3*2 + header.bytes + header_comm.bytes + header_code.bytes; p= avccontext->extradata= av_mallocz(avccontext->extradata_size); *(p++) = header.bytes>>8; *(p++) = header.bytes&0xFF; memcpy(p, header.packet, header.bytes); p += header.bytes; *(p++) = header_comm.bytes>>8; *(p++) = header_comm.bytes&0xFF; memcpy(p, header_comm.packet, header_comm.bytes); p += header_comm.bytes; *(p++) = header_code.bytes>>8; *(p++) = header_code.bytes&0xFF; memcpy(p, header_code.packet, header_code.bytes); /* vorbis_block_clear(&context->vb); vorbis_dsp_clear(&context->vd); vorbis_info_clear(&context->vi);*/ vorbis_comment_clear(&context->vc); avccontext->frame_size = OGGVORBIS_FRAME_SIZE ; avccontext->coded_frame= avcodec_alloc_frame(); avccontext->coded_frame->key_frame= 1; return 0 ; }