Hi All,
I'm writing a video file splitter but I cant create a valid output
context. I get SIGSEGV at dump_format. What am I doing wrong? Is there
a simple tutorial to follow?
I use this (shortened) code:
AVStream *new_video_stream(AVFormatContext *oc,AVCodecContext *icc);
AVStream *new_audio_stream(AVFormatContext *oc,AVCodecContext *icc);
void copy_stream_params(AVFormatContext *oc, AVStream *ost, AVStream *ist);
......
......
......
//======== output file
#define OUTFILE "testout.avi"
AVFormatContext *oc;
AVStream *ovs=NULL,*oas=NULL;
oc = avformat_alloc_context();
AVOutputFormat *file_oformat;
file_oformat = av_guess_format(NULL, OUTFILE, NULL);
oc->oformat=file_oformat;
strncpy(oc->filename, OUTFILE, sizeof(oc->filename)-1);
ovs=new_video_stream(oc,pVCodecCtx);
oas=new_audio_stream(oc,pACodecCtx);
iurl_fopen(&oc->pb, OUTFILE, URL_WRONLY) ;
copy_stream_params(oc,ovs,ic->streams[ivsi]);
copy_stream_params(oc,oas,ic->streams[iasi]);
av_write_header(oc);
dump_format(oc, 0, OUTFILE, 0);
.......
.......
.......
//this functions are based on ffmpeg.c
AVStream *new_video_stream(AVFormatContext *oc,AVCodecContext *icc)
{
AVStream *st;
AVCodecContext *video_enc;
st = av_new_stream(oc, oc->nb_streams);
if (!st) {
printf("N: new_video_stream(): Could not alloc stream\n");
return NULL;
}
avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
//SDR:this will not be needed?!
//avcodec_thread_init(st->codec, 1);
video_enc = st->codec;
video_enc->codec_tag= icc->codec_tag;
if (((icc->flags && CODEC_FLAG_GLOBAL_HEADER) ==
CODEC_FLAG_GLOBAL_HEADER ) || (oc->oformat->flags &
AVFMT_GLOBALHEADER)){
video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
/*
if ((icc->flags2 && CODEC_FLAG_GLOBAL_HEADER) ==
CODEC_FLAG_GLOBAL_HEADER ) {
video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
}*/
st->stream_copy = 1;
video_enc->codec_type = CODEC_TYPE_VIDEO;
video_enc->sample_aspect_ratio = st->sample_aspect_ratio =
icc->sample_aspect_ratio;
return st;
}
AVStream *new_audio_stream(AVFormatContext *oc,AVCodecContext *icc)
{
AVStream *st;
AVCodecContext *audio_enc;
st = av_new_stream(oc, oc->nb_streams);
if (!st) {
printf("N: new_video_stream(): Could not alloc stream\n");
return NULL;
}
avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
//SDR: do we need this?
//avcodec_thread_init(st->codec, 1);
audio_enc = st->codec;
audio_enc->codec_type = CODEC_TYPE_AUDIO;
audio_enc->codec_tag= icc->codec_tag;
if ((oc->oformat->flags & AVFMT_GLOBALHEADER) || ((icc->flags &&
CODEC_FLAG_GLOBAL_HEADER)==CODEC_FLAG_GLOBAL_HEADER)) audio_enc->flags
|= CODEC_FLAG_GLOBAL_HEADER;
st->stream_copy = 1;
audio_enc->channels = icc->channels;
audio_enc->sample_rate = icc->sample_rate;
audio_enc->time_base= icc->time_base;
return st;
}
void copy_stream_params(AVFormatContext *oc, AVStream *ost, AVStream *ist){
AVCodecContext *codec = ost->codec;
AVCodecContext *icodec = ist->codec;
ost->disposition = ist->disposition;
codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
codec->chroma_sample_location = icodec->chroma_sample_location;
codec->codec_id = icodec->codec_id;
codec->codec_type = icodec->codec_type;
codec->codec_tag = icodec->codec_tag;
codec->bit_rate = icodec->bit_rate;
codec->extradata= icodec->extradata;
codec->extradata_size= icodec->extradata_size;
codec->time_base = ist->time_base;
switch(codec->codec_type) {
case CODEC_TYPE_AUDIO:
codec->channel_layout = icodec->channel_layout;
codec->sample_rate = icodec->sample_rate;
codec->channels = icodec->channels;
codec->frame_size = icodec->frame_size;
codec->block_align= icodec->block_align;
if(codec->block_align == 1 && codec->codec_id ==
CODEC_ID_MP3)
codec->block_align= 0;
if(codec->codec_id == CODEC_ID_AC3)
codec->block_align= 0;
break;
case CODEC_TYPE_VIDEO:
codec->pix_fmt = icodec->pix_fmt;
codec->width = icodec->width;
codec->height = icodec->height;
codec->has_b_frames = icodec->has_b_frames;
break;
case CODEC_TYPE_SUBTITLE:
codec->width = icodec->width;
codec->height = icodec->height;
break;
default:
;
}
}
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user