mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-10-01 08:54:48 +02:00
remove function call from muxer->encoder and cleanly pass global headers
Originally committed as revision 2956 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
6d8f985ecf
commit
bbb77e7c2e
@ -7,7 +7,6 @@
|
|||||||
#include <vorbis/vorbisenc.h>
|
#include <vorbis/vorbisenc.h>
|
||||||
|
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "oggvorbis.h"
|
|
||||||
|
|
||||||
//#define OGGVORBIS_FRAME_SIZE 1024
|
//#define OGGVORBIS_FRAME_SIZE 1024
|
||||||
#define OGGVORBIS_FRAME_SIZE 64
|
#define OGGVORBIS_FRAME_SIZE 64
|
||||||
@ -27,7 +26,7 @@ typedef struct OggVorbisContext {
|
|||||||
} OggVorbisContext ;
|
} OggVorbisContext ;
|
||||||
|
|
||||||
|
|
||||||
int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) {
|
static int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) {
|
||||||
|
|
||||||
#ifdef OGGVORBIS_VBR_BY_ESTIMATE
|
#ifdef OGGVORBIS_VBR_BY_ESTIMATE
|
||||||
/* variable bitrate by estimate */
|
/* variable bitrate by estimate */
|
||||||
@ -44,9 +43,10 @@ int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int oggvorbis_encode_init(AVCodecContext *avccontext) {
|
static int oggvorbis_encode_init(AVCodecContext *avccontext) {
|
||||||
OggVorbisContext *context = avccontext->priv_data ;
|
OggVorbisContext *context = avccontext->priv_data ;
|
||||||
|
ogg_packet header, header_comm, header_code;
|
||||||
|
uint8_t *p;
|
||||||
|
|
||||||
vorbis_info_init(&context->vi) ;
|
vorbis_info_init(&context->vi) ;
|
||||||
if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) {
|
if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) {
|
||||||
@ -56,6 +56,34 @@ static int oggvorbis_encode_init(AVCodecContext *avccontext) {
|
|||||||
vorbis_analysis_init(&context->vd, &context->vi) ;
|
vorbis_analysis_init(&context->vd, &context->vi) ;
|
||||||
vorbis_block_init(&context->vd, &context->vb) ;
|
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->frame_size = OGGVORBIS_FRAME_SIZE ;
|
||||||
|
|
||||||
avccontext->coded_frame= avcodec_alloc_frame();
|
avccontext->coded_frame= avcodec_alloc_frame();
|
||||||
@ -103,7 +131,7 @@ static int oggvorbis_encode_frame(AVCodecContext *avccontext,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(context->buffer_index){
|
if(context->buffer_index){
|
||||||
ogg_packet *op2= context->buffer;
|
ogg_packet *op2= (ogg_packet*)context->buffer;
|
||||||
op2->packet = context->buffer + sizeof(ogg_packet);
|
op2->packet = context->buffer + sizeof(ogg_packet);
|
||||||
l= op2->bytes;
|
l= op2->bytes;
|
||||||
|
|
||||||
@ -143,6 +171,7 @@ static int oggvorbis_encode_close(AVCodecContext *avccontext) {
|
|||||||
vorbis_info_clear(&context->vi);
|
vorbis_info_clear(&context->vi);
|
||||||
|
|
||||||
av_freep(&avccontext->coded_frame);
|
av_freep(&avccontext->coded_frame);
|
||||||
|
av_freep(&avccontext->extradata);
|
||||||
|
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file oggvorbis.h
|
|
||||||
* oggvorbis.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AVCODEC_OGGVORBIS_H
|
|
||||||
#define AVCODEC_OGGVORBIS_H
|
|
||||||
|
|
||||||
#include <vorbis/vorbisenc.h>
|
|
||||||
|
|
||||||
#include "avcodec.h"
|
|
||||||
|
|
||||||
int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) ;
|
|
||||||
|
|
||||||
#endif
|
|
@ -9,10 +9,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <ogg/ogg.h>
|
#include <ogg/ogg.h>
|
||||||
#include <vorbis/vorbisenc.h>
|
|
||||||
|
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
#include "oggvorbis.h"
|
|
||||||
|
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -35,52 +33,28 @@ typedef struct OggContext {
|
|||||||
static int ogg_write_header(AVFormatContext *avfcontext)
|
static int ogg_write_header(AVFormatContext *avfcontext)
|
||||||
{
|
{
|
||||||
OggContext *context = avfcontext->priv_data;
|
OggContext *context = avfcontext->priv_data;
|
||||||
AVCodecContext *avccontext ;
|
ogg_packet *op= &context->op;
|
||||||
vorbis_info vi ;
|
int n, i;
|
||||||
vorbis_dsp_state vd ;
|
|
||||||
vorbis_comment vc ;
|
|
||||||
vorbis_block vb ;
|
|
||||||
ogg_packet header, header_comm, header_code ;
|
|
||||||
int n ;
|
|
||||||
|
|
||||||
av_set_pts_info(avfcontext, 60, 1, AV_TIME_BASE);
|
av_set_pts_info(avfcontext, 60, 1, AV_TIME_BASE);
|
||||||
|
|
||||||
ogg_stream_init(&context->os, 31415);
|
ogg_stream_init(&context->os, 31415);
|
||||||
|
|
||||||
for(n = 0 ; n < avfcontext->nb_streams ; n++) {
|
for(n = 0 ; n < avfcontext->nb_streams ; n++) {
|
||||||
avccontext = &avfcontext->streams[n]->codec ;
|
AVCodecContext *codec = &avfcontext->streams[n]->codec;
|
||||||
|
uint8_t *p= codec->extradata;
|
||||||
|
|
||||||
|
for(i=0; i < codec->extradata_size; i+= op->bytes){
|
||||||
|
op->bytes = p[i++]<<8;
|
||||||
|
op->bytes+= p[i++];
|
||||||
|
|
||||||
/* begin vorbis specific code */
|
op->packet= &p[i];
|
||||||
|
op->b_o_s= op->packetno==0;
|
||||||
vorbis_info_init(&vi) ;
|
|
||||||
|
|
||||||
/* code copied from libavcodec/oggvorbis.c */
|
ogg_stream_packetin(&context->os, op);
|
||||||
|
|
||||||
if(oggvorbis_init_encoder(&vi, avccontext) < 0) {
|
op->packetno++; //FIXME multiple streams
|
||||||
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", LIBAVFORMAT_IDENT) ;
|
|
||||||
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->header_handled = 0 ;
|
||||||
}
|
}
|
||||||
@ -88,7 +62,6 @@ static int ogg_write_header(AVFormatContext *avfcontext)
|
|||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ogg_write_packet(AVFormatContext *avfcontext,
|
static int ogg_write_packet(AVFormatContext *avfcontext,
|
||||||
int stream_index,
|
int stream_index,
|
||||||
const uint8_t *buf, int size, int64_t pts)
|
const uint8_t *buf, int size, int64_t pts)
|
||||||
|
Loading…
Reference in New Issue
Block a user