把自定义的decoder加入ffmpeg源码

Posted DoubleLi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把自定义的decoder加入ffmpeg源码相关的知识,希望对你有一定的参考价值。

第一步:

在libavcodec目录下新建mkdecoder.c,并加入一下代码:
[cpp] view plain copy
 
  1. /*  
  2. *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame 
  3. *作者:缪国凯(MK)  
  4. *[email protected]  
  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\n");  
  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\n");  
  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,成功!

以上是关于把自定义的decoder加入ffmpeg源码的主要内容,如果未能解决你的问题,请参考以下文章

加入域时如何将自定义组自动加入到本地管理员组

我在哪里把自定义代码放在 Laravel

phpcmsv9怎么把自定义表单去掉了?

我是如何把自定义注解应用到生产的

ffmpeg代码实现自定义encoder

把自定义url配置到SAP Fiori Launchpad上打开