第一步:

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

第二步:

在avcodec.h里的 enum AVCodecID 最后加入:
  1. AV_CODEC_ID_MKVIDEO,

第三步:

在allcodec.c的void avcodec_register_all(void)函数中加入

  1. REGISTER_DECODER(MKVIDEO,          mkvideo);

第四步:

在libavcodec的makefile里加入:

  1. OBJS-$(CONFIG_MKVIDEO_DECODER)              += mkdecoder.o

第五步:

在ffmpeg根目录config.h里加入:

  1. #define CONFIG_MKVIDEO_DECODER 1

第六步:

在codec_desc.c的static const AVCodecDescriptor codec_descriptors[] 中加入:

  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改为

  1. AV_CODEC_ID_MKVIDEO

第八步:

重新编译ffmpeg。

测试:

运行命令:ffmpeg -decoders:在显示中找到自己的decoder:
  1. VF...D mimic                Mimic
  2. V....D mjpeg                MJPEG (Motion JPEG)
  3. V....D mjpegb               Apple MJPEG-B
  4. V..... mkvideo              mk video

运行命令:

  1. ffmpeg -s 1280x720 -i test.mk -y test.avi

生成test.avi,并在转码过程中打出在代码中添加的标记:

  1. init mk decoder
播放test.avi,能正确播放,ok,成功!

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

  1. 把自定义的demuxer加入ffmpeg源码

    .简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer 第一步: 在libavformat目录下新建mkdemuxer.c和mkdemuxer.h ...

  2. ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分

    本页内容包含了在Unix/Linux中用源码包编译的通用的结构 可能不仅仅适用于ffmpeg 为啥使用源码包编译 编译源码可以扩展功能, 实现相对于自己平台的最优化, 还可以自定义的修改 概述 大部分 ...

  3. 最新版ffmpeg源码分析

    最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下 ...

  4. 修改FFMpeg源码—捕获丢包

    概述 最近我们项目有一个需求就是解决客户端播放RTSP视频流花屏的问题,一般来说丢包就会引起花屏,导致客户端花屏的因素又有很多,比如说: 相机到服务器丢包 服务器到客户端丢包 等等... 其中服务器到 ...

  5. FFmpeg源码结构图 - 解码

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  6. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  7. FFmpeg源码结构图 - 编码

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  8. FFmpeg源码简单分析:结构体成员管理系统-AVOption

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  9. ffmpeg源码编译环境搭建

    ffmpeg是视频开发最常用到的开源软件,FFmpeg功能强大,用途广泛,提供几乎所有你能够想到的与视频开发相关的操作,许多商业软件都以ffmpeg为基础进行开发定制. FFmpeg: FFmpeg ...

随机推荐

  1. Win7程序运行出现Windows Based Scrip Host 已停止工作问题的解决方法

    最近在使用类似于Teamviewer这样的程序时,突然运行不了,报错:Microsoft Windows Based Scrip Host 已停止工作的问题,从系统日志来看,好像是空指针问题,但是又无 ...

  2. 基于python实现简单web服务器

    做web开发的你,真的熟悉web服务器处理机制吗? 分析请求数据 下面是一段原始的请求数据: b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nConnectio ...

  3. Go 学习笔记

    官网: https://golang.org/ 环境: $GOROOT: GOROOT环境变量指定了Go的安装目录. $GOPATH: GOPATH 环境变量指定workspace的目录. 命令行: ...

  4. StackOverflow&&Quora&&More 翻译系列——目录

    启动了一个翻译系列,主要收录个人在伯乐在线上翻译的文章,或者在 StackOverflow.Quora 及其他资讯站上发现的好文,选文比较偏个人喜好.希望能够学习.理解文章的同时提高英语水平,并共享知 ...

  5. READ_TEXT

    [转自http://lz357502668.blog.163.com/blog/static/1649674320109119101907/]这里,定义ITAB内表来存储长文本,并放到内表ITAB_E ...

  6. 【thrift】初识thrift

    Reference:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://jacksongblack.blog.51c ...

  7. ubuntu13.04中把ibus中的中文拼音输入设为默认

    全新的ubuntu ,先选择 下载服务器 首选项->软件和更新 选择 最佳服务器 准备工作:卸载Ubuntu默认的ibus输入法: sudo apt-get remove ibus 然后添加Fc ...

  8. Data Structure Binary Tree: Populate Inorder Successor for all nodes

    http://www.geeksforgeeks.org/populate-inorder-successor-for-all-nodes/ #include <iostream> #in ...

  9. linux操作系统使用中的一些总结

    VIM常用命令 gg   //到第一行 (N)G   //到第n行(N为整数) G    //到最后一行 0    //到行头 $  //到行尾 (N)dd  //删除N行,并将内容保存到粘贴板 p ...

  10. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...