当前位置: 首页 > news >正文

瑞芯微MPP音视频框架---mjpeg解码

一些参考资料:

开发手册:doc/Rockchip_Developer_Guide_MPP_CN.md · HermanChen/mpp - 码云 - 开源中国

项目readme:mpp: Rockchip MPP(Media Process Platfrom) - Gitee.com

源码gitee:https://gitee.com/hermanchen82/mpp/blob/develop

源码github:rockchip-linux/mpp: Media Process Platform (MPP) module

前言

瑞芯微MPP(Media Process Platform)是瑞芯微半导体为其芯片平台开发的多媒体处理框架,主要用于硬件加速的音视频编解码。以下是对该框架的总结:

核心特点

MPP框架是一个统一的多媒体处理接口,封装了瑞芯微芯片的硬件编解码器功能,提供了标准化的API接口,使开发者能够充分利用硬件加速能力进行高效的音视频处理。

主要功能

视频解码支持:支持H.264、H.265/HEVC、VP8、VP9、AV1等主流视频格式的硬件解码,能够处理4K甚至更高分辨率的视频内容。

视频编码支持:提供H.264、H.265等格式的硬件编码功能,适用于视频录制、流媒体传输等应用场景。

图像处理:集成了图像缩放、格式转换、旋转等基础图像处理功能。

架构特点

MPP采用模块化设计,将编解码器、内存管理、缓冲区管理等功能分离,提供了灵活的组合使用方式。框架支持零拷贝操作,减少内存拷贝开销,提高处理效率。

应用场景

该框架广泛应用于智能摄像头、行车记录仪、安防监控、流媒体设备、机器视觉等需要高效音视频处理的嵌入式应用中。

之所以写mpp,是因为对于很多嵌入式解码器,有一定的参考意义。

mjpeg解码

MJPEG基础知识

MJPEG (Motion JPEG) 是一种视频压缩格式,其基本原理是将视频流分解为连续的JPEG静态图像序列。与H.264等现代编码方式不同,MJPEG不进行帧间预测编码,每一帧都是完全独立的。

MJPEG特点

  • 每一帧都是独立编码的完整JPEG图像;
  • 编解码复杂度低,适合实时应用;
  • 压缩率相对较低,但抗噪性好,不容易出现类似h264那种马赛克;
  • 适合需要高质量单帧提取的场景;

这里是一个简单的mjpeg流,可以看到里面有一堆的jpeg图片,可以清晰看到数据结构

MJPEG解码流程

  • 1. 解析MJPEG文件头/流头
  • 2. 寻找每个JPEG帧的边界
  • 3. 对每一帧进行JPEG解码
    • 解析JPEG头
    • 熵解码(霍夫曼解码)
    • 反量化
    • 反DCT变换
    • 色彩空间转换
  • 4. 显示或保存;然后准备处理下一帧;

MPP中JPEG解码基本流程

JPEG解码主要包含以下步骤:

  1. 标记(marker)识别与解析 - 解析SOI(开始)、EOI(结束)、SOF(帧信息)等标记
  2. 解析量化表(DQT)和霍夫曼表(DHT)
  3. 解析帧信息(SOF) - 获取图像尺寸、颜色空间等信息
  4. 解析扫描信息(SOS) - 为实际解码做准备
  5. 解码图像数据 - 通过硬件完成

文件位置:parse在mpp/codec/dec/jpeg/jpegd_parser.c中

关键函数分析

  1. jpegd_find_marker

    • 功能:在字节流中寻找JPEG标记(0xFF后跟有效标记码)
    • 输入:指向缓冲区的指针和结束位置
    • 输出:找到的标记值(0-255)或0(未找到)
  2. jpegd_decode_frame

    • 功能:完整解码一帧JPEG图像的主控函数
    • 流程:遍历整个数据流,识别各种标记并调用对应处理函数
    • 返回:解码状态(成功/失败)
  3. jpegd_decode_dht

    • 功能:解析霍夫曼表数据
    • 处理:分别解析DC表和AC表,并存储到语法结构中
  4. jpegd_decode_dqt

    • 功能:解析量化表数据
    • 处理:读取并存储量化矩阵数据
  5. jpegd_decode_sof

    • 功能:解析帧开始信息
    • 处理:读取图像宽高、组件信息,并调用jpeg_judge_yuv_mode确定YUV模式
  6. jpegd_decode_sos

    • 功能:解析扫描开始信息
    • 处理:确定使用的霍夫曼表和量化表
  7. jpeg_judge_yuv_mode

    • 功能:根据采样因子确定YUV格式(420/422/444等)
    • 处理:分析水平和垂直采样因子组合判断具体格式
  8. jpegd_setup_default_dht

    • 功能:设置标准默认霍夫曼表
    • 使用场景:当JPEG流中缺少DHT标记时使用
  9. jpegd_parse

    • 功能:统一解析入口
    • 处理:调用jpegd_decode_frame并设置解码任务

JPEG解码流程时序图

以下是从应用层到硬件层的JPEG解码完整时序图,详细描述了每个步骤的数据流和处理过程:

关键步骤说明

  1. 初始化阶段:

    • 应用程序创建MPP上下文
    • 初始化解码器、解析器和硬件抽象层
    • 分配必要的资源(语法结构、缓冲区等)
  2. 解码准备阶段:

    • 应用程序发送JPEG数据包
    • 解码器准备解码任务
    • 解析器处理输入包并设置任务参数
  3. 解析阶段:

    • 解析器解析JPEG头信息(标记、表格、尺寸等)
    • 计算实际图像数据的位置和长度
    • 分配输出帧缓冲区
    • 将解析结果填充到任务结构中
  4. 硬件配置阶段:

    • 硬件抽象层根据解析结果配置硬件寄存器
    • 设置输入数据地址、长度、霍夫曼表、量化表等
    • 设置输出缓冲区地址
  5. 硬件解码阶段:

    • 启动硬件解码
    • 硬件直接从内存读取图像数据
    • 根据寄存器配置进行解码
    • 将结果写入输出缓冲区
  6. 后处理阶段:

    • 等待硬件解码完成
    • 更新帧信息(错误检查、颜色设置等)
    • 将解码帧加入输出队列
    • 通知应用程序解码完成
  7. 输出阶段:

    • 应用程序获取解码后的帧
    • 处理帧数据
    • 释放帧资源
  8. 清理阶段:

    • 应用程序销毁MPP上下文
    • 释放所有分配的资源

这个时序图详细展示了JPEG解码的完整流程,从应用层到硬件层的每个步骤都有清晰的描述,特别是解析后数据如何传递给硬件进行实际解码的关键过程。

http://www.dtcms.com/a/391653.html

相关文章:

  • 模型部署:(七)安卓端部署OCR文本识别项目全流程记录
  • 用html5写一个超级计算器
  • 手机实现真随机数生成器
  • 119.计数器产生中断(上升沿)计算方法,比如cnt[21:0],那么assign time = cnt[20]这样大致是多长时间产生一次中断
  • VSCode c/c++头文件函数点击无法跳转问题
  • `mysql_real_connect` 函数全面深度解析
  • 深入解析Yum元数据安全与Artifactory自动化原理
  • 第三章 强化学习助力优化
  • 使用角色和Ansible内容集合简化Playbook
  • 鸿蒙应用集成Push Kit 指南
  • 树莓派ubuntu20.04实现ROS noetic与Arduino通信
  • 【代码随想录算法训练营——Day17】二叉树——654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • 托福听力44
  • C++——STL
  • 「ECG信号处理——(25)基于ECG心率变异性(HRV)与EDA皮肤电活动的生理状态分析」2025年9月19日
  • 高通camx架构学习(四)——Camera Framework
  • 接口安全攻防战:从入门到精通的全方位防护指南
  • GEO(Generative Engine Optimization)技术详解与2025实践指南
  • Amazon SES 移出沙盒完整指南 高通过率模板
  • 从 IP over 鸽子到 TCP 的适应性
  • 大模型提示工程
  • 鸿蒙应用开发——Repeat组件的使用
  • 远程控制的全球节点功能如何开启?插件类型、并发数量怎么选?
  • 因果推断:因果回归树处理异质性处理效应(三)
  • 六应用层-真题
  • python笔记之正则篇(四)
  • 无标题文档
  • LeetCode 面试经典 150 题之验证回文串:双指针解题思路详解
  • pandas在AI中与其他库的协作
  • 【软件测试】第5章 测试分类(下)