把自定义的decoder加入ffmpeg源码

59 篇文章 25 订阅
2 篇文章 0 订阅

第一步:

在libavcodec目录下新建mkdecoder.c,并加入一下代码:
/* 
*实现一个自己的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,
};

第二步:

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

第三步:

在allcodec.c的void avcodec_register_all(void)函数中加入
REGISTER_DECODER(MKVIDEO,          mkvideo);  

第四步:

在libavcodec的makefile里加入:
OBJS-$(CONFIG_MKVIDEO_DECODER)              += mkdecoder.o

第五步:

在ffmpeg根目录config.h里加入:
#define CONFIG_MKVIDEO_DECODER 1 

第六步:

在codec_desc.c的static const AVCodecDescriptor codec_descriptors[] 中加入:
{
        .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,
},

第七步:

把以前实现的mkdemuxer的codeid改为
AV_CODEC_ID_MKVIDEO

第八步:

重新编译ffmpeg。

测试:

运行命令:ffmpeg -decoders:在显示中找到自己的decoder:
 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
播放test.avi,能正确播放,ok,成功!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dancing_night

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值