• 把自定义的decoder加入ffmpeg源码


    第一步:

    在libavcodec目录下新建mkdecoder.c,并加入一下代码:
    [cpp] view plain copy
     
    1. /*  
    2. *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame 
    3. *作者:缪国凯(MK)  
    4. *821486004@qq.com  
    5. *2015-6-5  
    6. */   
    7. #include "avcodec.h"  
    8.   
    9. static av_cold int mk_init_decoder(AVCodecContext *avctx)  
    10. {  
    11.     printf("init mk decoder ");  
    12.     return 0;  
    13. }  
    14.   
    15. static int mk_decode(AVCodecContext *avctx, void *data, int *got_frame,  
    16.     AVPacket *avpkt)  
    17. {  
    18.     AVFrame   *frame   = (AVFrame*)data;  
    19.     AVPicture *picture = (AVPicture*)data;  
    20.     const uint8_t *buf             = avpkt->data;  
    21.     int buf_size                   = avpkt->size;  
    22.   
    23.     int size = avpicture_get_size(avctx->pix_fmt, avctx->width,  
    24.         avctx->height);  
    25.   
    26.     frame->pict_type        = AV_PICTURE_TYPE_I;  
    27.     frame->key_frame        = 1;  
    28.       
    29.     frame->buf[0] = av_buffer_alloc(size);  
    30.       
    31.     memcpy(frame->buf[0]->data, buf, buf_size);  
    32.   
    33.     int res = 0;  
    34.     if ((res = avpicture_fill(picture, frame->buf[0]->data, avctx->pix_fmt,  
    35.         avctx->width, avctx->height)) < 0)   
    36.     {  
    37.             av_buffer_unref(&frame->buf[0]);  
    38.             return res;  
    39.     }  
    40.   
    41.     *got_frame = 1;  
    42.     return 0;  
    43. }  
    44.   
    45. static av_cold int mk_close_decoder(AVCodecContext *avctx)  
    46. {  
    47.     printf("init mk decoder ");  
    48.     return 0;  
    49. }  
    50.   
    51. AVCodec ff_mkvideo_decoder = {  
    52.     .name           = "mkvideo",  
    53.     .long_name      = "mk video",  
    54.     .type           = AVMEDIA_TYPE_VIDEO,  
    55.     .id             = AV_CODEC_ID_MKVIDEO,  
    56.     .capabilities   = CODEC_CAP_PARAM_CHANGE,     
    57.     .init           = mk_init_decoder,    
    58.     .decode         = mk_decode,  
    59.     .close          = mk_close_decoder,  
    60. };  

    第二步:

    在avcodec.h里的 enum AVCodecID 最后加入:
    [cpp] view plain copy
     
    1. AV_CODEC_ID_MKVIDEO,  

    第三步:

    在allcodec.c的void avcodec_register_all(void)函数中加入
    [cpp] view plain copy
     
    1. REGISTER_DECODER(MKVIDEO,          mkvideo);    

    第四步:

    在libavcodec的makefile里加入:
    [cpp] view plain copy
     
    1. OBJS-$(CONFIG_MKVIDEO_DECODER)              += mkdecoder.o  

    第五步:

    在ffmpeg根目录config.h里加入:
    [cpp] view plain copy
     
    1. #define CONFIG_MKVIDEO_DECODER 1   

    第六步:

    在codec_desc.c的static const AVCodecDescriptor codec_descriptors[] 中加入:
    [cpp] view plain copy
     
    1. {  
    2.         .id        = AV_CODEC_ID_MKVIDEO,  
    3.         .type      = AVMEDIA_TYPE_VIDEO,  
    4.         .name      = "mkvideo",  
    5.         .long_name = NULL_IF_CONFIG_SMALL("mk video"),  
    6.         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,  
    7. },  

    第七步:

    把以前实现的mkdemuxer的codeid改为
    [cpp] view plain copy
     
    1. AV_CODEC_ID_MKVIDEO  

    第八步:

    重新编译ffmpeg。

    测试:

    运行命令:ffmpeg -decoders:在显示中找到自己的decoder:
    [cpp] view plain copy
     
    1. VF...D mimic                Mimic  
    2. V....D mjpeg                MJPEG (Motion JPEG)  
    3. V....D mjpegb               Apple MJPEG-B  
    4. V..... mkvideo              mk video  
    运行命令:
    [cpp] view plain copy
     
    1. ffmpeg -s 1280x720 -i test.mk -y test.avi  
    生成test.avi,并在转码过程中打出在代码中添加的标记:
    [cpp] view plain copy
     
    1. init mk decoder  
    播放test.avi,能正确播放,ok,成功!
  • 相关阅读:
    Servlet的生命周期
    Servlet中的请求与响应
    Servlet中的相关的配置文件信息:
    转发与重定向的区别,笔记无法转过来,所以直接放链接了,可以直接查看
    JSP入门中的一些案例代码:
    一些已经有些模糊的小知识(一)
    JSP入门五之request,out,response对象的应用
    JSP入门四
    JSP入门三 不知道如何将笔记同步过来只能这样了
    来自(乐唯科技)的面试问题..
  • 原文地址:https://www.cnblogs.com/lidabo/p/7324926.html
Copyright © 2020-2023  润新知