把自定义的decoder加入ffmpeg源码

简介: 第一步: 在libavcodec目录下新建mkdecoder.c,并加入一下代码: [cpp] view plain copy   /*   *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame  *作者:缪国凯(MK)   *821486004@qq.

第一步:

在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\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,成功!
目录
相关文章
|
7月前
|
编解码 API
ffmpeg.c(4.3.1)源码剖析(一)
ffmpeg.c(4.3.1)源码剖析(一)
139 2
|
7月前
|
Linux iOS开发 开发者
探索FFmpeg:实现自定义播放速度的全方位指南(一)
探索FFmpeg:实现自定义播放速度的全方位指南
565 0
|
2月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
198 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
7月前
|
算法 Ubuntu API
探索FFmpeg:实现自定义播放速度的全方位指南(二)
探索FFmpeg:实现自定义播放速度的全方位指南
243 0
|
7月前
|
缓存 网络协议 Windows
FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码
在国内访问GitHub不稳定时,可以采取三种解决方法。首先,通过网站(<https://ping.chinaz.com/github.com>)找到快速响应的GitHub IP,将其添加到本地hosts文件,然后刷新DNS缓存以正常访问。其次,使用代下载网站如(<https://d.serctl.com/>)下载GitHub上的压缩包。最后,可从国内镜像站点,如码云(<https://gitee.com/mirrors/ffmpeg>),下载FFmpeg等开源代码。这些方法有助于绕过访问限制,确保FFmpeg学习与开发的顺利进行。
159 3
FFmpeg开发笔记(六)如何访问Github下载FFmpeg源码
|
7月前
|
编解码 容器
ffmpeg.c(4.3.1)源码剖析(三)
ffmpeg.c(4.3.1)源码剖析(三)
56 1
|
7月前
ffmpeg.c(4.3.1)源码剖析(二)
ffmpeg.c(4.3.1)源码剖析(二)
108 0
|
7月前
|
算法 C++
探索FFmpeg:实现自定义播放速度的全方位指南(三)
探索FFmpeg:实现自定义播放速度的全方位指南
209 0
|
7月前
|
存储 编解码 缓存
FFmpeg之旅:深入解析FFplay源码
FFmpeg之旅:深入解析FFplay源码
659 0
|
7月前
|
编解码 网络协议 API
ffmpeg命令行工具源码之结构体分析1-命令行参数(未完结,持续更新)
ffmpeg作为多媒体文件转换工具,至少需要有一个要转换的输入文件信息(不仅仅是普通文件,还可以是摄像头设备,网络流等),和通常至少需要一个输出格式的文件(输出文件不仅仅指普通的文件,网络协议比如RTP协议,RTSP协议都可以理解为输出文件),ffmpeg的文件的转换过程主要由以下几个流程 (1)解封装 (2)解码 (3)过滤器 (4)编码 (5)封装 因此ffmpeg工具涉及的结构体主要就从这几个方面来说明这些结构体的含义。
80 0