把自定义的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. 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 最后加入:

[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-10-11 04:54:03

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

把自定义的demuxer加入ffmpeg源码

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

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的.对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug. sorry,废话多了.首先给个思路: 1.使opencv 的hi

最新版ffmpeg源码分析

最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我也搞得希里糊涂的,先不管它了. ffmpeg的主要功能是音视频的转换和处理.其功能之强大已经到了匪夷所思的地步(有点替它吹了).它的主要特点是能做到把多个输入文件中的任意几个流重新组合到输出文件中,当然输出文件也可

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

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

FFmpeg源码结构图 - 解码

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

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

===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 - 编码 [通用] FFmpeg 源码简单分析:av_register_all() FFmpeg 源码简单分析:avcodec_register_all() FFmpeg 源码简单分析:内存的分配和释放(av_malloc().av_free()等) FFmpeg 源码简单分析:常

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

通过之前的详细分析,我们知道:在measure中测量了View的大小,在layout阶段确定了View的位置. 完成这两步之后就进入到了我们相对熟悉的draw阶段,在该阶段真正地开始对视图进行绘制. 按照之前的惯例,我们来瞅瞅View中draw( )的源码 public void draw(Canvas canvas) { final int privateFlags = mPrivateFlags; final boolean dirtyOpaque = (privateFlags & PFL

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

PS:如果觉得文章太长,那就直接看视频吧 在经过measure阶段以后,系统确定了View的测量大小,接下来就进入到layout的过程. 在该过程中会确定视图的显示位置,即子View在其父控件中的位置. 嗯哼,我们直接扒开源码从View的layout( )开始入手. //l, t, r, b分别表示子View相对于父View的左.上.右.下的坐标 public void layout(int l, int t, int r, int b) { if ((mPrivateFlags3 & PFLA

【转】ANDROID自定义视图——onMeasure,MeasureSpec源码 流程 思路详解

原文地址:http://blog.csdn.net/a396901990/article/details/36475213 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步