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

📄 utils.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
字号:
/* * utils for libavcodec * Copyright (c) 2001 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "avcodec.h"#include "dsputil.h"#include "mpegvideo.h"void *av_mallocz(unsigned int size){    void *ptr;    ptr = av_malloc(size);    if (!ptr)        return NULL;    memset(ptr, 0, size);    return ptr;}/* cannot call it directly because of 'void **' casting is not automatic */void __av_freep(void **ptr){    av_free(*ptr);    *ptr = NULL;}/* encoder management */AVCodec *first_avcodec;void register_avcodec(AVCodec *format){    AVCodec **p;    p = &first_avcodec;    while (*p != NULL) p = &(*p)->next;    *p = format;    format->next = NULL;}void avcodec_get_context_defaults(AVCodecContext *s){    s->bit_rate= 800*1000;    s->bit_rate_tolerance= s->bit_rate*10;    s->qmin= 2;    s->qmax= 31;    s->rc_eq= "tex^qComp";    s->qcompress= 0.5;    s->max_qdiff= 3;    s->b_quant_factor=1.25;    s->b_quant_offset=1.25;    s->i_quant_factor=-0.8;    s->i_quant_offset=0.0;    s->error_concealment= 3;    s->error_resilience= 1;    s->workaround_bugs= FF_BUG_AUTODETECT;    s->frame_rate = 25 * FRAME_RATE_BASE;    s->gop_size= 50;    s->me_method= ME_EPZS;}/** * allocates a AVCodecContext and set it to defaults. * this can be deallocated by simply calling free()  */AVCodecContext *avcodec_alloc_context(void){    AVCodecContext *avctx= av_mallocz(sizeof(AVCodecContext));        if(avctx==NULL) return NULL;        avcodec_get_context_defaults(avctx);        return avctx;}int avcodec_open(AVCodecContext *avctx, AVCodec *codec){    int ret;    avctx->codec = codec;    avctx->frame_number = 0;    if (codec->priv_data_size > 0) {        avctx->priv_data = av_mallocz(codec->priv_data_size);        if (!avctx->priv_data)             return -ENOMEM;    } else {        avctx->priv_data = NULL;    }    ret = avctx->codec->init(avctx);    if (ret < 0) {        av_freep(&avctx->priv_data);        return ret;    }    return 0;}int avcodec_encode_audio(AVCodecContext *avctx, UINT8 *buf, int buf_size,                          const short *samples){    int ret;    ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples);    avctx->frame_number++;    return ret;}int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size,                          const AVPicture *pict){    int ret;    ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict);        emms_c(); //needed to avoid a emms_c() call before every return;    avctx->frame_number++;    return ret;}/* decode a frame. return -1 if error, otherwise return the number of   bytes used. If no frame could be decompressed, *got_picture_ptr is   zero. Otherwise, it is non zero */int avcodec_decode_video(AVCodecContext *avctx, AVPicture *picture,                          int *got_picture_ptr,                         UINT8 *buf, int buf_size){    int ret;    ret = avctx->codec->decode(avctx, picture, got_picture_ptr,                                buf, buf_size);    emms_c(); //needed to avoid a emms_c() call before every return;    if (*got_picture_ptr)                                   avctx->frame_number++;    return ret;}/* decode an audio frame. return -1 if error, otherwise return the   *number of bytes used. If no frame could be decompressed,   *frame_size_ptr is zero. Otherwise, it is the decompressed frame   *size in BYTES. */int avcodec_decode_audio(AVCodecContext *avctx, INT16 *samples,                          int *frame_size_ptr,                         UINT8 *buf, int buf_size){    int ret;    ret = avctx->codec->decode(avctx, samples, frame_size_ptr,                                buf, buf_size);    avctx->frame_number++;    return ret;}int avcodec_close(AVCodecContext *avctx){    if (avctx->codec->close)        avctx->codec->close(avctx);    av_freep(&avctx->priv_data);    avctx->codec = NULL;    return 0;}AVCodec *avcodec_find_encoder(enum CodecID id){    AVCodec *p;    p = first_avcodec;    while (p) {        if (p->encode != NULL && p->id == id)            return p;        p = p->next;    }    return NULL;}AVCodec *avcodec_find_encoder_by_name(const char *name){    AVCodec *p;    p = first_avcodec;    while (p) {        if (p->encode != NULL && strcmp(name,p->name) == 0)            return p;        p = p->next;    }    return NULL;}AVCodec *avcodec_find_decoder(enum CodecID id){    AVCodec *p;    p = first_avcodec;    while (p) {        if (p->decode != NULL && p->id == id)            return p;        p = p->next;    }    return NULL;}AVCodec *avcodec_find_decoder_by_name(const char *name){    AVCodec *p;    p = first_avcodec;    while (p) {        if (p->decode != NULL && strcmp(name,p->name) == 0)            return p;        p = p->next;    }    return NULL;}AVCodec *avcodec_find(enum CodecID id){    AVCodec *p;    p = first_avcodec;    while (p) {        if (p->id == id)            return p;        p = p->next;    }    return NULL;}const char *pix_fmt_str[] = {    "yuv420p",    "yuv422",    "rgb24",    "bgr24",    "yuv422p",    "yuv444p",    "rgba32",    "bgra32",    "yuv410p",    "yuv411p",};void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode){    const char *codec_name;    AVCodec *p;    char buf1[32];    char channels_str[100];    int bitrate;    if (encode)        p = avcodec_find_encoder(enc->codec_id);    else        p = avcodec_find_decoder(enc->codec_id);    if (p) {        codec_name = p->name;    } else if (enc->codec_name[0] != '\0') {        codec_name = enc->codec_name;    } else {        /* output avi tags */        if (enc->codec_type == CODEC_TYPE_VIDEO) {            snprintf(buf1, sizeof(buf1), "%c%c%c%c",                      enc->codec_tag & 0xff,                     (enc->codec_tag >> 8) & 0xff,                     (enc->codec_tag >> 16) & 0xff,                     (enc->codec_tag >> 24) & 0xff);        } else {            snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag);        }        codec_name = buf1;    }    switch(enc->codec_type) {    case CODEC_TYPE_VIDEO:        snprintf(buf, buf_size,                 "Video: %s%s",                 codec_name, enc->flags & CODEC_FLAG_HQ ? " (hq)" : "");        if (enc->codec_id == CODEC_ID_RAWVIDEO) {            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", %s",                     pix_fmt_str[enc->pix_fmt]);        }        if (enc->width) {            snprintf(buf + strlen(buf), buf_size - strlen(buf),                     ", %dx%d, %0.2f fps",                     enc->width, enc->height,                      (float)enc->frame_rate / FRAME_RATE_BASE);        }        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:                sprintf(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_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;    default:        av_abort();    }    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);    }}/* Picture field are filled with 'ptr' addresses */void avpicture_fill(AVPicture *picture, UINT8 *ptr,                    int pix_fmt, int width, int height){    int size;    size = width * height;    switch(pix_fmt) {    case PIX_FMT_YUV420P:        picture->data[0] = ptr;        picture->data[1] = picture->data[0] + size;        picture->data[2] = picture->data[1] + size / 4;        picture->linesize[0] = width;        picture->linesize[1] = width / 2;        picture->linesize[2] = width / 2;        break;    case PIX_FMT_YUV422P:        picture->data[0] = ptr;        picture->data[1] = picture->data[0] + size;        picture->data[2] = picture->data[1] + size / 2;        picture->linesize[0] = width;        picture->linesize[1] = width / 2;        picture->linesize[2] = width / 2;        break;    case PIX_FMT_YUV444P:        picture->data[0] = ptr;        picture->data[1] = picture->data[0] + size;        picture->data[2] = picture->data[1] + size;        picture->linesize[0] = width;        picture->linesize[1] = width;        picture->linesize[2] = width;        break;    case PIX_FMT_RGB24:    case PIX_FMT_BGR24:        picture->data[0] = ptr;        picture->data[1] = NULL;        picture->data[2] = NULL;        picture->linesize[0] = width * 3;        break;    case PIX_FMT_RGBA32:    case PIX_FMT_BGRA32:        picture->data[0] = ptr;        picture->data[1] = NULL;        picture->data[2] = NULL;        picture->linesize[0] = width * 4;        break;    case PIX_FMT_YUV422:        picture->data[0] = ptr;        picture->data[1] = NULL;        picture->data[2] = NULL;        picture->linesize[0] = width * 2;        break;    default:        picture->data[0] = NULL;        picture->data[1] = NULL;        picture->data[2] = NULL;        break;    }}int avpicture_get_size(int pix_fmt, int width, int height){    int size;    size = width * height;    switch(pix_fmt) {    case PIX_FMT_YUV420P:        size = (size * 3) / 2;        break;    case PIX_FMT_YUV422P:        size = (size * 2);        break;    case PIX_FMT_YUV444P:        size = (size * 3);        break;    case PIX_FMT_RGB24:    case PIX_FMT_BGR24:        size = (size * 3);        break;    case PIX_FMT_RGBA32:    case PIX_FMT_BGRA32:        size = (size * 4);        break;    case PIX_FMT_YUV422:        size = (size * 2);        break;    default:        size = -1;        break;    }    return size;}unsigned avcodec_version( void ){  return LIBAVCODEC_VERSION_INT;}unsigned avcodec_build( void ){  return LIBAVCODEC_BUILD;}/* must be called before any other functions */void avcodec_init(void){    static int inited = 0;    if (inited != 0)	return;    inited = 1;    //dsputil_init();}/* this should be called after seeking and before trying to decode the next frame */void avcodec_flush_buffers(AVCodecContext *avctx){    MpegEncContext *s = avctx->priv_data;    s->num_available_buffers=0;}static int raw_encode_init(AVCodecContext *s){    return 0;}static int raw_decode_frame(AVCodecContext *avctx,			    void *data, int *data_size,			    UINT8 *buf, int buf_size){    return -1;}static int raw_encode_frame(AVCodecContext *avctx,			    unsigned char *frame, int buf_size, void *data){    return -1;}AVCodec rawvideo_codec = {    "rawvideo",    CODEC_TYPE_VIDEO,    CODEC_ID_RAWVIDEO,    0,    raw_encode_init,    raw_encode_frame,    NULL,    raw_decode_frame,};

⌨️ 快捷键说明

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