utils.c

来自「linux下的MPEG1」· C语言 代码 · 共 1,355 行 · 第 1/5 页

C
1,355
字号
    switch(enc->codec_type) {    case CODEC_TYPE_VIDEO:        snprintf(buf, buf_size,                 "Video: %s%s",                 codec_name, enc->mb_decision ? " (hq)" : "");        if (enc->pix_fmt != PIX_FMT_NONE) {            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", %s",                     avcodec_get_pix_fmt_name(enc->pix_fmt));        }        if (enc->width) {            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", %dx%d",                     enc->width, enc->height);            if(av_log_get_level() >= AV_LOG_DEBUG){                int g= ff_gcd(enc->time_base.num, enc->time_base.den);                snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", %d/%d",                     enc->time_base.num/g, enc->time_base.den/g);            }        }        if (encode) {            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", q=%d-%d", enc->qmin, enc->qmax);        }        bitrate = enc->bit_rate;        break;    case CODEC_TYPE_AUDIO:        snprintf(buf, buf_size,                 "Audio: %s",                 codec_name);        switch (enc->channels) {            case 1:                strcpy(channels_str, "mono");                break;            case 2:                strcpy(channels_str, "stereo");                break;            case 6:                strcpy(channels_str, "5:1");                break;            default:                snprintf(channels_str, sizeof(channels_str), "%d channels", enc->channels);                break;        }        if (enc->sample_rate) {            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", %d Hz, %s",                     enc->sample_rate,                     channels_str);        }        /* for PCM codecs, compute bitrate directly */        switch(enc->codec_id) {        case CODEC_ID_PCM_S32LE:        case CODEC_ID_PCM_S32BE:        case CODEC_ID_PCM_U32LE:        case CODEC_ID_PCM_U32BE:            bitrate = enc->sample_rate * enc->channels * 32;            break;        case CODEC_ID_PCM_S24LE:        case CODEC_ID_PCM_S24BE:        case CODEC_ID_PCM_U24LE:        case CODEC_ID_PCM_U24BE:        case CODEC_ID_PCM_S24DAUD:            bitrate = enc->sample_rate * enc->channels * 24;            break;        case CODEC_ID_PCM_S16LE:        case CODEC_ID_PCM_S16BE:        case CODEC_ID_PCM_U16LE:        case CODEC_ID_PCM_U16BE:            bitrate = enc->sample_rate * enc->channels * 16;            break;        case CODEC_ID_PCM_S8:        case CODEC_ID_PCM_U8:        case CODEC_ID_PCM_ALAW:        case CODEC_ID_PCM_MULAW:            bitrate = enc->sample_rate * enc->channels * 8;            break;        default:            bitrate = enc->bit_rate;            break;        }        break;    case CODEC_TYPE_DATA:        snprintf(buf, buf_size, "Data: %s", codec_name);        bitrate = enc->bit_rate;        break;    case CODEC_TYPE_SUBTITLE:        snprintf(buf, buf_size, "Subtitle: %s", codec_name);        bitrate = enc->bit_rate;        break;    default:        snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type);        return;    }    if (encode) {        if (enc->flags & CODEC_FLAG_PASS1)            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", pass 1");        if (enc->flags & CODEC_FLAG_PASS2)            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", pass 2");    }    if (bitrate != 0) {        snprintf(buf + strlen(buf), buf_size - strlen(buf),                 ", %d kb/s", bitrate / 1000);    }}unsigned avcodec_version( void ){  return LIBAVCODEC_VERSION_INT;}unsigned avcodec_build( void ){  return LIBAVCODEC_BUILD;}static void init_crcs(void){    av_crc04C11DB7= av_mallocz_static(sizeof(AVCRC) * 257);    av_crc8005    = av_mallocz_static(sizeof(AVCRC) * 257);    av_crc07      = av_mallocz_static(sizeof(AVCRC) * 257);    av_crc_init(av_crc04C11DB7, 0, 32, 0x04c11db7, sizeof(AVCRC)*257);    av_crc_init(av_crc8005    , 0, 16, 0x8005    , sizeof(AVCRC)*257);    av_crc_init(av_crc07      , 0,  8, 0x07      , sizeof(AVCRC)*257);}/* must be called before any other functions */void avcodec_init(void){    static int inited = 0;    if (inited != 0)        return;    inited = 1;    dsputil_static_init();    init_crcs();}/** * Flush buffers, should be called when seeking or when swicthing to a different stream. */void avcodec_flush_buffers(AVCodecContext *avctx){    if(avctx->codec->flush)        avctx->codec->flush(avctx);}void avcodec_default_free_buffers(AVCodecContext *s){    int i, j;    if(s->internal_buffer==NULL) return;    for(i=0; i<INTERNAL_BUFFER_SIZE; i++){        InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i];        for(j=0; j<4; j++){            av_freep(&buf->base[j]);            buf->data[j]= NULL;        }    }    av_freep(&s->internal_buffer);    s->internal_buffer_count=0;}char av_get_pict_type_char(int pict_type){    switch(pict_type){    case I_TYPE: return 'I';    case P_TYPE: return 'P';    case B_TYPE: return 'B';    case S_TYPE: return 'S';    case SI_TYPE:return 'i';    case SP_TYPE:return 'p';    default:     return '?';    }}int av_get_bits_per_sample(enum CodecID codec_id){    switch(codec_id){    case CODEC_ID_ADPCM_SBPRO_2:        return 2;    case CODEC_ID_ADPCM_SBPRO_3:        return 3;    case CODEC_ID_ADPCM_SBPRO_4:    case CODEC_ID_ADPCM_CT:        return 4;    case CODEC_ID_PCM_ALAW:    case CODEC_ID_PCM_MULAW:    case CODEC_ID_PCM_S8:    case CODEC_ID_PCM_U8:        return 8;    case CODEC_ID_PCM_S16BE:    case CODEC_ID_PCM_S16LE:    case CODEC_ID_PCM_U16BE:    case CODEC_ID_PCM_U16LE:        return 16;    case CODEC_ID_PCM_S24DAUD:    case CODEC_ID_PCM_S24BE:    case CODEC_ID_PCM_S24LE:    case CODEC_ID_PCM_U24BE:    case CODEC_ID_PCM_U24LE:        return 24;    case CODEC_ID_PCM_S32BE:    case CODEC_ID_PCM_S32LE:    case CODEC_ID_PCM_U32BE:    case CODEC_ID_PCM_U32LE:        return 32;    default:        return 0;    }}#if !defined(HAVE_THREADS)int avcodec_thread_init(AVCodecContext *s, int thread_count){    return -1;}#endifunsigned int av_xiphlacing(unsigned char *s, unsigned int v){    unsigned int n = 0;    while(v >= 0xff) {        *s++ = 0xff;        v -= 0xff;        n++;    }    *s = v;    n++;    return n;}/* Wrapper to work around the lack of mkstemp() on mingw/cygin. * Also, tries to create file in /tmp first, if possible. * *prefix can be a character constant; *filename will be allocated internally. * Returns file descriptor of opened file (or -1 on error) * and opened file name in **filename. */int av_tempfile(char *prefix, char **filename) {    int fd=-1;#ifdef __MINGW32__    *filename = tempnam(".", prefix);#else    size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */    *filename = av_malloc(len);#endif    /* -----common section-----*/    if (*filename == NULL) {        av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n");        return -1;    }#ifdef __MINGW32__    fd = open(*filename, _O_RDWR | _O_BINARY | _O_CREAT, 0444);#else    snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);    fd = mkstemp(*filename);    if (fd < 0) {        snprintf(*filename, len, "./%sXXXXXX", prefix);        fd = mkstemp(*filename);    }#endif    /* -----common section-----*/    if (fd < 0) {        av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename);        return -1;    }    return fd; /* success */}

⌨️ 快捷键说明

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