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

Reply via email to