3. 注册codec

文章介绍了如何在Linux环境中为Rockchip平台设备注册一个dummycodec。它涉及到了dts配置,如rockchip,dummy-codec,以及驱动代码的编写,包括内存分配、时钟获取和组件注册。在驱动代码中,通过devm_snd_soc_register_component将component挂载到全局列表。当处理mclk时,对可能的错误进行了检查和处理。
摘要由CSDN通过智能技术生成

数字mic系列,注册codec

 对应dts如下

    dummy_codec: dummy-codec {
        compatible = "rockchip,dummy-codec";
        #sound-dai-cells = <0>;
    }; 

驱动代码 sound/soc/codecs/dummy-codec.c

static int rockchip_dummy_codec_probe(struct platform_device *pdev)
{
    struct dummy_codec_priv *dcp;

    dcp = devm_kzalloc(&pdev->dev, sizeof(*dcp), GFP_KERNEL);
    if (!dcp)
        return -ENOMEM;

    platform_set_drvdata(pdev, dcp);

    /* optional mclk, if needs, assign mclk in dts node */
    dcp->mclk = devm_clk_get(&pdev->dev, "mclk");
    if (IS_ERR(dcp->mclk)) {
        if (PTR_ERR(dcp->mclk) == -EPROBE_DEFER)
            return -EPROBE_DEFER;
        else if (PTR_ERR(dcp->mclk) != -ENOENT)
            return -EINVAL;
    }   
    /* 将component通过list挂载到 component_list (全局) 上*/
    return devm_snd_soc_register_component(&pdev->dev, &soc_dummy_codec,
                           &dummy_dai, 1); 
}

static const struct of_device_id rockchip_dummy_codec_of_match[] = { 
    { .compatible = "rockchip,dummy-codec", },
    {}, 
};
MODULE_DEVICE_TABLE(of, rockchip_dummy_codec_of_match);

static struct platform_driver rockchip_dummy_codec_driver = { 
    .driver = { 
        .name = "dummy_codec",
        .of_match_table = of_match_ptr(rockchip_dummy_codec_of_match),
    },  
    .probe = rockchip_dummy_codec_probe,
};

于是就有了这样的链接

 

FFmpeg是一个强大的跨平台多媒体框架,它支持广泛的音频和视频文件处理,包括编码、解码、流媒体转换等。对于解码视频API的调用流程,通常分为以下几个步骤: 1. **初始化 FFmpeg**:首先需要包含FFmpeg库,并创建一个`avformat_context`结构体实例,这是FFmpeg的核心结构,用于存储解码器上下文信息。 ```c av_register_all(); avformat_network_init(); // 初始化网络模块 avformat_instance = avformat_alloc_context(); ``` 2. **打开输入文件**:通过`avformat_open_input`函数指定要解码的文件路径,并设置`avformat_instance`。 ```c if (avformat_open_input(&avformat_instance, input_filename, NULL, NULL) < 0) { // 处理错误 } ``` 3. **查找并注册解析器**:调用`avformat_find_stream_info`来获取文件的元数据,并自动注册相关的解析器。 ```c if (avformat_find_stream_info(avformat_instance, NULL) < 0) { // 处理错误 } ``` 4. **选择视频流**:遍历`avformat_instance->streams`,找到视频流并获取解码器上下文`avcodec_context`。 ```c for (int i = 0; i < avformat_instance->nb_streams; ++i) { if (avstream_is_video(avformat_instance->streams[i])) { video_codec_ctx = avformat_get.stream(i)->codec; break; } } ``` 5. **分配解码器和帧缓冲区**:初始化解码器并分配内存缓冲区用于存放解码后的像素数据。 ```c if (avcodec_open2(video_codec_ctx, avcodec_find_decoder(video_codec_ctx->codec_id), NULL) < 0) { // 处理错误 } frame = av_frame_alloc(); ``` 6. **解码视频帧**:调用`avcodec_decode_video2`函数,提供输入缓冲区和输出缓冲区,直到返回错误或者达到文件结束。 7. **播放/处理解码后的帧**:循环解码,可以对解码后的帧进行显示、分析或者其他操作。 8. **释放资源**:解码完成后,记得关闭解码器、释放帧,以及清理FFmpeg的其他资源。 ```c avcodec_close(video_codec_ctx); av_frame_free(&frame); avformat_close_input(&avformat_instance); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dianlong_lee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值