把自定义的decoder加入ffmpeg源码
第一步:
- /*
- *实现一个自己的decoder,编码工作其实就是把pkt的数据拷贝到frame
- *作者:缪国凯(MK)
- *821486004@qq.com
- *2015-6-5
- */
- #include "avcodec.h"
- static av_cold int mk_init_decoder(AVCodecContext *avctx)
- {
- printf("init mk decoder\n");
- return 0;
- }
- static int mk_decode(AVCodecContext *avctx, void *data, int *got_frame,
- AVPacket *avpkt)
- {
- AVFrame *frame = (AVFrame*)data;
- AVPicture *picture = (AVPicture*)data;
- const uint8_t *buf = avpkt->data;
- int buf_size = avpkt->size;
- int size = avpicture_get_size(avctx->pix_fmt, avctx->width,
- avctx->height);
- frame->pict_type = AV_PICTURE_TYPE_I;
- frame->key_frame = 1;
- frame->buf[0] = av_buffer_alloc(size);
- memcpy(frame->buf[0]->data, buf, buf_size);
- int res = 0;
- if ((res = avpicture_fill(picture, frame->buf[0]->data, avctx->pix_fmt,
- avctx->width, avctx->height)) < 0)
- {
- av_buffer_unref(&frame->buf[0]);
- return res;
- }
- *got_frame = 1;
- return 0;
- }
- static av_cold int mk_close_decoder(AVCodecContext *avctx)
- {
- printf("init mk decoder\n");
- return 0;
- }
- AVCodec ff_mkvideo_decoder = {
- .name = "mkvideo",
- .long_name = "mk video",
- .type = AVMEDIA_TYPE_VIDEO,
- .id = AV_CODEC_ID_MKVIDEO,
- .capabilities = CODEC_CAP_PARAM_CHANGE,
- .init = mk_init_decoder,
- .decode = mk_decode,
- .close = mk_close_decoder,
- };
第二步:
- AV_CODEC_ID_MKVIDEO,
第三步:
- REGISTER_DECODER(MKVIDEO, mkvideo);
第四步:
- OBJS-$(CONFIG_MKVIDEO_DECODER) += mkdecoder.o
第五步:
- #define CONFIG_MKVIDEO_DECODER 1
第六步:
- {
- .id = AV_CODEC_ID_MKVIDEO,
- .type = AVMEDIA_TYPE_VIDEO,
- .name = "mkvideo",
- .long_name = NULL_IF_CONFIG_SMALL("mk video"),
- .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
- },
第七步:
- AV_CODEC_ID_MKVIDEO
第八步:
测试:
- VF...D mimic Mimic
- V....D mjpeg MJPEG (Motion JPEG)
- V....D mjpegb Apple MJPEG-B
- V..... mkvideo mk video
运行命令:
- ffmpeg -s 1280x720 -i test.mk -y test.avi
生成test.avi,并在转码过程中打出在代码中添加的标记:
- init mk decoder
把自定义的decoder加入ffmpeg源码的更多相关文章
- 把自定义的demuxer加入ffmpeg源码
.简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer 第一步: 在libavformat目录下新建mkdemuxer.c和mkdemuxer.h ...
- ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分
本页内容包含了在Unix/Linux中用源码包编译的通用的结构 可能不仅仅适用于ffmpeg 为啥使用源码包编译 编译源码可以扩展功能, 实现相对于自己平台的最优化, 还可以自定义的修改 概述 大部分 ...
- 最新版ffmpeg源码分析
最新版ffmpeg源码分析一:框架 (ffmpeg v0.9) 框架 最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下 ...
- 修改FFMpeg源码—捕获丢包
概述 最近我们项目有一个需求就是解决客户端播放RTSP视频流花屏的问题,一般来说丢包就会引起花屏,导致客户端花屏的因素又有很多,比如说: 相机到服务器丢包 服务器到客户端丢包 等等... 其中服务器到 ...
- FFmpeg源码结构图 - 解码
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码简单分析:libswscale的sws_scale()
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码结构图 - 编码
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- FFmpeg源码简单分析:结构体成员管理系统-AVOption
===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...
- ffmpeg源码编译环境搭建
ffmpeg是视频开发最常用到的开源软件,FFmpeg功能强大,用途广泛,提供几乎所有你能够想到的与视频开发相关的操作,许多商业软件都以ffmpeg为基础进行开发定制. FFmpeg: FFmpeg ...
随机推荐
- 第4章 URL管理器和实现方法
URL管理器:管理待抓取URL集合和已抓取URL集合 -- 防止重复抓取.防止循环抓取 URL需要支持哪些功能: 添加新URL到待爬取集合中.判断待添加URL是否在容器中,判断是否还有待爬取URL,获 ...
- 修改Jmeter配置使能支持更大并发
Jmeter做并发测试时,报错 java.lang.OutOfMemoryError:gc overhead limit exceeded. 原因是jmeter默认分配内存的参数很小,256M吧.故而 ...
- Delphi窗体研究,留个爪,以后回来研究
Delphi - 窗体创建过程 来自大富翁. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- cocos2d-x CCControl控件
感谢点评与关注.欢迎转载与分享.勤奋努力,持之以恒! CCControlSlider 滑动条 void HelloWorld::myInit10() { CCSize size = CCDirecto ...
- hive查询注意及优化tips
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具.使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别, 所以需要去掉原有关系型数 ...
- MySQL——视图
核心知识点: 1.视图定义 2.视图的好处:安全.节约资源.操作简单,数据的同一性 3.视图的基本操作 一.视图概论 视图是一个虚拟表,其内容由查询定义. 同真实的表一样,视图包含一系列带有名称的列和 ...
- android客户端登录&注册的实现
MainActivity多线程的实现: package com.example.loginconnect; import java.lang.ref.WeakReference; import jav ...
- 【LeetCode】合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- 剑指offer之 O(1)时间删除链表结点
问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. package Problem13; /* * 问题描述:给定单向链表的头指针和一个结点指针,定义一个函数在O(1 ...
- 《python基础教程(第二版)》学习笔记 语句/循环/条件(第5章)
<python基础教程(第二版)>学习笔记 语句/循环/条件(第5章) print 'AB', 123 ==> AB 123 # 插入了一个空格print 'AB', 'CD' == ...