⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffmpeg.c.svn-base

📁 mediastreamer2是开源的网络传输媒体流的库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
    for(i=0;i<nb_input_files;i++) {        is = input_files[i];        file_table[i].ist_index = j;        file_table[i].nb_streams = is->nb_streams;        j += is->nb_streams;    }    nb_istreams = j;    ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));    if (!ist_table)        goto fail;    for(i=0;i<nb_istreams;i++) {        ist = av_mallocz(sizeof(AVInputStream));        if (!ist)            goto fail;        ist_table[i] = ist;    }    j = 0;    for(i=0;i<nb_input_files;i++) {        is = input_files[i];        for(k=0;k<is->nb_streams;k++) {            ist = ist_table[j++];            ist->st = is->streams[k];            ist->file_index = i;            ist->index = k;            ist->discard = 1; /* the stream is discarded by default                                 (changed later) */            if (ist->st->codec->rate_emu) {                ist->start = av_gettime();                ist->frame = 0;            }        }    }    /* output stream init */    nb_ostreams = 0;    for(i=0;i<nb_output_files;i++) {        os = output_files[i];        if (!os->nb_streams) {            fprintf(stderr, "Output file does not contain any stream\n");            exit(1);        }        nb_ostreams += os->nb_streams;    }    if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {        fprintf(stderr, "Number of stream maps must match number of output streams\n");        exit(1);    }    /* Sanity check the mapping args -- do the input files & streams exist? */    for(i=0;i<nb_stream_maps;i++) {        int fi = stream_maps[i].file_index;        int si = stream_maps[i].stream_index;        if (fi < 0 || fi > nb_input_files - 1 ||            si < 0 || si > file_table[fi].nb_streams - 1) {            fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);            exit(1);        }        fi = stream_maps[i].sync_file_index;        si = stream_maps[i].sync_stream_index;        if (fi < 0 || fi > nb_input_files - 1 ||            si < 0 || si > file_table[fi].nb_streams - 1) {            fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);            exit(1);        }    }    ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);    if (!ost_table)        goto fail;    for(i=0;i<nb_ostreams;i++) {        ost = av_mallocz(sizeof(AVOutputStream));        if (!ost)            goto fail;        ost_table[i] = ost;    }    n = 0;    for(k=0;k<nb_output_files;k++) {        os = output_files[k];        for(i=0;i<os->nb_streams;i++) {            int found;            ost = ost_table[n++];            ost->file_index = k;            ost->index = i;            ost->st = os->streams[i];            if (nb_stream_maps > 0) {                ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +                    stream_maps[n-1].stream_index;                /* Sanity check that the stream types match */                if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {                    fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",                        stream_maps[n-1].file_index, stream_maps[n-1].stream_index,                        ost->file_index, ost->index);                    exit(1);                }            } else {                if(opt_programid) {                    found = 0;                    j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);                    if(j != -1) {                        ost->source_index = j;                        found = 1;                    }                } else {                    /* get corresponding input stream index : we select the first one with the right type */                    found = 0;                    for(j=0;j<nb_istreams;j++) {                        ist = ist_table[j];                        if (ist->discard &&                            ist->st->codec->codec_type == ost->st->codec->codec_type) {                            ost->source_index = j;                            found = 1;                            break;                        }                    }                }                if (!found) {                    if(! opt_programid) {                        /* try again and reuse existing stream */                        for(j=0;j<nb_istreams;j++) {                            ist = ist_table[j];                            if (ist->st->codec->codec_type == ost->st->codec->codec_type) {                                ost->source_index = j;                                found = 1;                            }                        }                    }                    if (!found) {                        fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",                                ost->file_index, ost->index);                        exit(1);                    }                }            }            ist = ist_table[ost->source_index];            ist->discard = 0;            ost->sync_ist = (nb_stream_maps > 0) ?                ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +                         stream_maps[n-1].sync_stream_index] : ist;        }    }    /* for each output stream, we compute the right encoding parameters */    for(i=0;i<nb_ostreams;i++) {        ost = ost_table[i];        os = output_files[ost->file_index];        ist = ist_table[ost->source_index];        codec = ost->st->codec;        icodec = ist->st->codec;        if (!ost->st->language[0])            av_strlcpy(ost->st->language, ist->st->language,                       sizeof(ost->st->language));        if (ost->st->stream_copy) {            /* if stream_copy is selected, no need to decode or encode */            codec->codec_id = icodec->codec_id;            codec->codec_type = icodec->codec_type;            if(!codec->codec_tag){                if(   !os->oformat->codec_tag                   || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0                   || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)                    codec->codec_tag = icodec->codec_tag;            }            codec->bit_rate = icodec->bit_rate;            codec->extradata= icodec->extradata;            codec->extradata_size= icodec->extradata_size;            if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)                codec->time_base = icodec->time_base;            else                codec->time_base = ist->st->time_base;            switch(codec->codec_type) {            case CODEC_TYPE_AUDIO:                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;                break;            case CODEC_TYPE_VIDEO:                if(using_vhook) {                    fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");                    exit(1);                }                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:                break;            default:                abort();            }        } else {            switch(codec->codec_type) {            case CODEC_TYPE_AUDIO:                if (av_fifo_init(&ost->fifo, 2 * MAX_AUDIO_PACKET_SIZE))                    goto fail;                ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;                icodec->request_channels = codec->channels;                ist->decoding_needed = 1;                ost->encoding_needed = 1;                break;            case CODEC_TYPE_VIDEO:                ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);                ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);                ost->video_resample = ((codec->width != icodec->width -                                (frame_leftBand + frame_rightBand) +                                (frame_padleft + frame_padright)) ||                        (codec->height != icodec->height -                                (frame_topBand  + frame_bottomBand) +                                (frame_padtop + frame_padbottom)) ||                        (codec->pix_fmt != icodec->pix_fmt));                if (ost->video_crop) {                    ost->topBand = frame_topBand;                    ost->leftBand = frame_leftBand;                }                if (ost->video_pad) {                    ost->padtop = frame_padtop;                    ost->padleft = frame_padleft;                    ost->padbottom = frame_padbottom;                    ost->padright = frame_padright;                    if (!ost->video_resample) {                        avcodec_get_frame_defaults(&ost->pict_tmp);                        if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,                                         codec->width, codec->height ) )                            goto fail;                    }                }                if (ost->video_resample) {                    avcodec_get_frame_defaults(&ost->pict_tmp);                    if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,                                         codec->width, codec->height ) ) {                        fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");                        exit(1);                    }                    sws_flags = av_get_int(sws_opts, "sws_flags", NULL);                    ost->img_resample_ctx = sws_getContext(                            icodec->width - (frame_leftBand + frame_rightBand),                            icodec->height - (frame_topBand + frame_bottomBand),                            icodec->pix_fmt,                            codec->width - (frame_padleft + frame_padright),                            codec->height - (frame_padtop + frame_padbottom),                            codec->pix_fmt,                            sws_flags, NULL, NULL, NULL);                    if (ost->img_resample_ctx == NULL) {                        fprintf(stderr, "Cannot get resampling context\n");                        exit(1);                    }                    ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);                }                ost->encoding_needed = 1;                ist->decoding_needed = 1;                break;            case CODEC_TYPE_SUBTITLE:                ost->encoding_needed = 1;                ist->decoding_needed = 1;                break;            default:                abort();                break;            }            /* two pass mode */            if (ost->encoding_needed &&                (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {                char logfilename[1024];                FILE *f;                int size;                char *logbuffer;                snprintf(logfilename, sizeof(logfilename), "%s-%d.log",                         pass_logfilename ?                         pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);                if (codec->flags & CODEC_FLAG_PASS1) {                    f = fopen(logfilename, "w");                    if (!f) {                        perror(logfilename);                        exit(1);                    }                    ost->logfile = f;                } else {                    /* read the log file */                    f = fopen(logfilename, "r");                    if (!f) {                        perror(logfilename);                        exit(1);                    }                    fseek(f, 0, SEEK_END);                    size = ftell(f);                    fseek(f, 0, SEEK_SET);                    logbuffer = av_malloc(size + 1);                    if (!logbuffer) {                        fprintf(stderr, "Could not allocate log buffer\n");                        exit(1);                    }                    size = fread(logbuffer, 1, size, f);                    fclose(f);                    logbuffer[size] = '\0';                    codec->stats_in = logbuffer;                }            }        }        if(codec->codec_type == CODEC_TYPE_VIDEO){            int size= codec->width * codec->height;            bit_buffer_size= FFMAX(bit_buffer_size, 4*size);        }    }    if (!bit_buffer)        bit_buffer = av_malloc(bit_buffer_size);    if (!bit_buffer)        goto fail;    /* dump the file output parameters - cannot be done before in case       of stream copy */    for(i=0;i<nb_output_files;i++) {        dump_format(output_files[i], i, output_files[i]->filename, 1);    }    /* dump the stream mapping */    if (verbose >= 0) {        fprintf(stderr, "Stream mapping:\n");        for(i=0;i<nb_ostreams;i++) {            ost = ost_table[i];            fprintf(stderr, "  Stream #%d.%d -> #%d.%d",                    ist_table[ost->source_index]->file_index,                    ist_table[ost->source_index]->index,                    ost->file_index,                    ost->index);            if (ost->sync_ist != ist_table[ost->source_index])                fprintf(stderr, " [sync #%d.%d]",                        ost->sync_ist->file_index,                        ost->sync_ist->index);            fprintf(stderr, "\n");        }    }    /* open each encoder */    for(i=0;i<nb_ostreams;i++) {        ost = ost_table[i];        if (ost->encoding_needed) {            AVCodec *codec;          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -