把自定义的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\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,成功!

时间: 2024-08-29 10:56:59

把自定义的decoder加入ffmpeg源码的相关文章

把自定义的demuxer加入ffmpeg源码

.简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer 第一步: 在libavformat目录下新建mkdemuxer.c和mkdemuxer.h,代码如下: mkdemuxer.c:   [cpp] view plain copy   /*   *实现一个自己的demuxer并加入到demuxer链中去  *作者:缪国凯(MK)   *821486004@qq.com   *2015-6-3   */       #include "mkd

自定义View系列教程04--Draw源码分析及其实践

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

自定义View系列教程03--onLayout源码详尽分析

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

Android自定义UI手势密码改进版源码下载_Android

在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 源码下载:http://xiazai.jb51.net/201610/yuanma/androidLock(jb51.net).rar 先看第一张图片的布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

自定义View系列教程02--onMeasure源码详尽分析

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–

超简单实现Android自定义Toast示例(附源码)

Bamboy的自定义Toast,(以下称作"BToast") 特点在于使用简单, 并且自带两种样式: 1)普通的文字样式: 2)带图标样式. 其中图标有√和×两种图标. BToast还有另外一个特点就是: 系统自带Toast采用的是队列的方式,当前Toast消失后,下一个Toast才能显示出来: 而BToast会把当前Toast顶掉, 直接显示最新的Toast. 那么,简单三步,我们现在就开始自定义一下吧! (一).Layout: 要自定义Toast, 首先我们需要一个XML布局. 但

Android自定义UI手势密码改进版源码下载

在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过. 源码下载:http://xiazai.jb51.net/201610/yuanma/androidLock(jb51.net).rar 先看第一张图片的布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

FCKEditor自定义用户目录(附源码)

由于我这边的网络原因,没用从FCK的官网下载到源码... 这套源码是FCK2.2版反编译出来的 源码:点此下载 源码中主要修改的地方做了注释 大致的修改如下 : 获取用户目录的源码: FileWorkerBase.cs 这里主要是做了一些注释 在程序中可以直接在用户登录的时候指定 这个方案只是方便多用户使用的时候为用户指定不同的文件目录 Session["FCKeditor:UserFilesPath"]="用户文件相对目录"; 代码 /// <summary

asp.net实现非常实用的自定义页面基类(附源码)_实用技巧

本文实例讲述了asp.net实现非常实用的自定义页面基类.分享给大家供大家参考,具体如下: 看到前面几篇文章(如:<asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法>)想到的.下面总结发布一个笔者在开发中常用的一个自定义BasePage类,废话不多说了,直接贴代码. 一.BasePage类 1.代码 using System; using System.Data; using System.Configuration; using System.Web; using