从零开始理解DM368的H264视频编码过程(下)

从DM35x到DM36x嵌入式平台迁移:硬件重构、驱动适配与高清视频处理实战 在嵌入式系统开发中,硬件平台迁移是常见的工程挑战,它涉及从底层电路设计到上层软件栈的全栈适配。其核心原理在于新平台往往在架构、外设集成和性能指标上进行迭代,开发者需要深入理解时钟体系、电源管理和总线协议等基础概念,才能确保系统稳定。这种迁移的技术价值在于能充分利用新芯片的性能红利,如更高的主频、更强的协处理器和更丰富的外设,从而提升产品竞争力。典型的应用场景包括视频监控设备升级、工业视觉系统换代以及需要支持高清编解码的便携媒体终端。本文以德州仪器TMS320DM36x数字媒体处理器为例,聚焦**高清视频协处 阅读详情

四、一些需要注意的问题和提示

色彩空间

在capture捕获线程中有一项设置叫色彩空间,colorspace 变量。色彩空间的定义在Dmai中的 ColorSpace.h 文件中:

/**
  * @brief Color formats.
  */
typedef enum {
    ColorSpace_NOTSET = -1,

    /**
      * @brief YUV 420 semi planar corresponding to V4L2_PIX_FMT_NV12 in v4l2.
      *        This format consists of two planes: one with the Y component
      *        and one with the CbCr components interleaved (hence semi).
      *        See the LSP documentation for a thorough description of this
      *        format.
      */
    ColorSpace_YUV420PSEMI = 0,

    /**
      * @brief YUV 422 semi planar corresponding to V4L2_PIX_FMT_YUV422UVP. This
      *        format was added to v4l2 by TI because the dm6467 VDCE and VPSS
      *        peripherals use this format. The format consists of two planes:
      *        one with the Y component and one with the CbCr components
      *        interleaved (hence semi) See the LSP VDCE documentation for a
      *        thorough description of this format.
      */
    ColorSpace_YUV422PSEMI,

    /** @brief YUV 422 interleaved corresponding to V4L2_PIX_FMT_UYVY in v4l2 */
    ColorSpace_UYVY,
    
    /** @brief RGB 888 packed corresponding to V4L2_PIX_FMT_RGB24 in v4l2 */
    ColorSpace_RGB888,

    /** @brief RGB 565 packed corresponding to V4L2_PIX_FMT_RGB565 in v4l2 */
    ColorSpace_RGB565,

    /**
      * @brief 2 bits per pixel. This is the format used by the VDCE for the
      *        bitmap while blending and is documented in the VDCE peripheral
      *        guide.
      */
    ColorSpace_2BIT,
    
    /**
      * @brief YUV 420 planar. The format consists of three planes:
      *        one with the Y component, one Cb, and one Cr component.
      */
    ColorSpace_YUV420P,
    
    /**
      * @brief YUV 422 planar. The format consists of three planes:
      *        one with the Y component, one Cb, and one Cr component.
      */
    ColorSpace_YUV422P,

    /**
      * @brief YUV 444 planar. The format consists of three planes:
      *        one with the Y component, one Cb, and one Cr component.
      */
    ColorSpace_YUV444P,
    
    /**
      * @brief Gray Scale. The format consist of single Luma plane
      *        ignoring the color plane components.      
      *             
      */
    ColorSpace_GRAY,

    ColorSpace_COUNT
} ColorSpace_Type;

支持的视频编码格式

在视频编码线程中支持的视频编码格式枚举变量在 VideoStd.h 文件中定义:

/** @brief Video standards */
typedef enum {
    VideoStd_AUTO = 0,      /**< Automatically select standard (if supported) */
    VideoStd_CIF,           /**< CIF @ 30 frames per second */
    VideoStd_SIF_NTSC,      /**< SIF @ 30 frames per second */
    VideoStd_SIF_PAL,       /**< SIF @ 25 frames per second */
    VideoStd_VGA,           /**< VGA (640x480) @ 60 frames per second */
    VideoStd_D1_NTSC,       /**< D1 NTSC @ 30 frames per second */
    VideoStd_D1_PAL,        /**< D1 PAL @ 25 frames per second */
    VideoStd_480P,          /**< D1 Progressive NTSC @ 60 frames per second */
    VideoStd_576P,          /**< D1 Progressive PAL @ 50 frames per second */
    VideoStd_720P_60,       /**< 720P @ 60 frames per second */
    VideoStd_720P_50,       /**< 720P @ 50 frames per second */
    VideoStd_720P_30,       /**< 720P @ 30 frames per second */
    VideoStd_1080I_30,      /**< 1080I @ 30 frames per second */
    VideoStd_1080I_25,      /**< 1080I @ 25 frames per second */
    VideoStd_1080P_30,      /**< 1080P @ 30 frames per second */
    VideoStd_1080P_25,      /**< 1080P @ 25 frames per second */
    VideoStd_1080P_24,      /**< 1080P @ 24 frames per second */
    VideoStd_QVGA,          /**< QVGA @ 30 frames per second */
    VideoStd_1080P_60,      /**< 1080P @ 60 frames per second */
    VideoStd_1080P_50,      /**< 1080P @ 50 frames per second */    
    VideoStd_1080I_60,      /**< 1080I @ 60 frames per second */    
    VideoStd_COUNT
} VideoStd_Type;

支持的视频输入源

支持的输入源枚举变量在 Capture.h 文件中定义:

/**
 * @brief       Video capture inputs.
 */
typedef enum {
    /** @brief S-Video video input */
    Capture_Input_SVIDEO = 0,

    /** @brief Composite video input */
    Capture_Input_COMPOSITE,

    /** @brief Component video input */
    Capture_Input_COMPONENT,

    /** @brief Camera/Imager card video input 
      * @remarks only applicable on DM368
      */
    Capture_Input_CAMERA,

    Capture_Input_COUNT
} Capture_Input;

Camera的更换

Dmai(达芬奇多媒体应用程序接口)中是调用V4L2库从系统中的video设备获取图像的。这一步可以在 Capture.c 文件中的 Capture_detectVideoStd 函数中得到证实:

/******************************************************************************
 * Capture_detectVideoStd
 ******************************************************************************/
Int Capture_detectVideoStd(Capture_Handle hCapture, VideoStd_Type *videoStdPtr,
                           Capture_Attrs *attrs)
{
    Int                failCount  =  0;
    Int                firstInput;
    Int                queryInput;
    struct v4l2_input  v4l2Input;
    v4l2_std_id        std;
    Int                input;
    Int                fd;
    Int                ret;

    assert(videoStdPtr);
    assert(attrs);

    /*
     * Initialize variables outside of variable declarations to suppress
     * "unused variable" warnings for platforms that don't use them.
     */
    Dmai_clear(v4l2Input);
    queryInput =  0;
    firstInput = -1;

    if (attrs->videoStd < 0 || attrs->videoStd > VideoStd_COUNT) {
        Dmai_err1("Invalid capture standard given (%d)\n", attrs->videoStd);
        return Dmai_EINVAL;
    }

    if (hCapture) {
        fd = hCapture->fd;
    }
    else {
        fd = open(attrs->captureDevice, O_RDWR, 0);

        if (fd == -1) {
            Dmai_err2("Cannot open %s (%s)\n", attrs->captureDevice,
                                               strerror(errno));
            return Dmai_EFAIL;
        }
    }

    if (attrs->decoderIdx < 0) {
        v4l2Input.type = V4L2_INPUT_TYPE_CAMERA;
        v4l2Input.index = 0;
        do {
            if (ioctl(fd, VIDIOC_ENUMINPUT, &v4l2Input) != 0) {
                Dmai_err2("%s input not found (%s)\n",
                          captureInputString[attrs->videoInput], strerror(errno));
                return Dmai_EFAIL;
            }
            v4l2Input.index++;        
        } while (strcmp((Char *) v4l2Input.name,
                            captureInputString[attrs->videoInput]) != 0);
        input = --v4l2Input.index;

        Dmai_dbg1("%s input selected\n", v4l2Input.name);

    } else {
        input = attrs->decoderIdx;
    }

    if (ioctl(fd, VIDIOC_S_INPUT, &input) == -1) {
        Dmai_err2("Failed to set video input to %d (%s)\n", 
            input, strerror(errno));
        return Dmai_EFAIL;
    }

    if (ioctl(fd, VIDIOC_G_INPUT, &queryInput) == -1) {
        Dmai_err0("Failed to retrieve video input setting\n");
        return Dmai_EFAIL;
    }

    if (input != queryInput) {
        Dmai_dbg2("Attempted to set video input to %d, but it still has a"
                  "setting of %d\n", input, queryInput);
        return Dmai_EFAIL;
    }

    if (attrs->videoStd != VideoStd_AUTO) {
        /* Force video standard */
        std = stds[attrs->videoStd];
    } else {
        Dmai_dbg0("Checking video standard\n");

        /* It might take a few tries to detect the signal */
        do {
            ret = ioctl(fd, VIDIOC_QUERYSTD, &std);

            if (ret == -1 && errno == EAGAIN) {
                usleep(1);
                failCount++;
            }
        } while (ret == -1 && errno == EAGAIN && failCount < NUM_IOCTL_RETRIES);

        if (ret == -1) {
            Dmai_err1("VIDIOC_QUERYSTD failed on %s. Video input connected?\n",
                      attrs->captureDevice);
            return Dmai_EFAIL;
        }
    }

    if(ioctl(fd, VIDIOC_S_STD, &std) == -1) {
        Dmai_err2("VIDIOC_S_STD failed on %s (%s)\n",
                  attrs->captureDevice, strerror(errno));
        return Dmai_EFAIL;
    }

    if (!hCapture) {
        close(fd);
    }

    if (std & V4L2_STD_NTSC) {
       *videoStdPtr = VideoStd_D1_NTSC;
    }
    else if (std & V4L2_STD_PAL) {
        *videoStdPtr = VideoStd_D1_PAL;
    }
    else if (std & V4L2_STD_525P_60) {
        *videoStdPtr = VideoStd_480P;
    }
    else if (std & V4L2_STD_625P_50) {
        *videoStdPtr = VideoStd_576P;
    }
    else if (std == V4L2_STD_720P_60) {
       *videoStdPtr = VideoStd_720P_60;
    }
    else if (std == V4L2_STD_720P_50) {
        *videoStdPtr = VideoStd_720P_50;
    }
#if 0
    else if (std == V4L2_STD_720P_30) {
        *videoStdPtr = VideoStd_720P_30;
    }
#endif
    else if (std == V4L2_STD_1080I_60) {
        *videoStdPtr = VideoStd_1080I_30;
    }
    else if (std == V4L2_STD_1080I_50) {
        *videoStdPtr = VideoStd_1080I_25;
    }
#if 0    
    else if (std == V4L2_STD_1080P_30) {
        *videoStdPtr = VideoStd_1080P_30;
    }
    else if (std == V4L2_STD_1080P_25) {
        *videoStdPtr = VideoStd_1080P_25;
    }
    else if (std == V4L2_STD_1080P_24) {
        *videoStdPtr = VideoStd_1080P_24;
    }
#endif
    else if (std == V4L2_STD_1080P_60) {
        *videoStdPtr = VideoStd_1080P_60;
    }
    else if (std == V4L2_STD_1080P_50) {
        *videoStdPtr = VideoStd_1080P_50;
    }        
    else {
        Dmai_err1("Unknown video standard on capture device %s\n",
                  attrs->captureDevice);
        return Dmai_EFAIL; 
    }

    attrs->videoStd = *videoStdPtr;
    Dmai_dbg2("Capture input set to %s:%d\n",
              captureInputString[attrs->videoInput], *videoStdPtr);

    return Dmai_EOK;
}

emmmm,函数有点长哈,总之,更换摄像头需要在linux内核中添加对新sensor的支持,且驱动要在V4L2框架下编写。不知道V4L2的请自行bing一下(因为我写累了)。

在DVSDK4_02_00_06中的Linux内核是2.6.32.17版本的,该内核支持的sensor非常有限,可以在 ./linux-2.6.32.17/drivers/media/video/ 中查看。

IDR帧

Dmai中,它比较皮,要是不设置,是不会产生IDR帧的。

在例程中,video线程处理部分,有这样的函数:

unsigned char idr_trigger = 0;//IDR帧触发变量
//IDR帧触发(这个判断在video的while中轮询)
		if(idr_trigger)
		{
				ForceIDR(hVe1, &dynParams, 1);
				idr_trigger=0;
		}

//修改产生IDR的设置
void ForceIDR(Venc1_Handle hVe1, VIDENC1_DynamicParams *dynParams, unsigned int idr)
{
	Int mystatus;
	VIDENC1_Status tEncStatus;
	VIDENC1_Handle enghandle = Venc1_getVisaHandle(hVe1);
	tEncStatus.size = sizeof(VIDENC1_Status);
	tEncStatus.data.buf = NULL;
	if(0 == idr)
	{
		dynParams->forceFrame = IVIDEO_NA_FRAME;
	}
	else
	{	
		dynParams->forceFrame = IVIDEO_IDR_FRAME;
	}
	mystatus = VIDENC1_control(enghandle, XDM_SETPARAMS, dynParams, &tEncStatus);
	if(mystatus != VIDENC1_EOK) 
	{
    	VIDENC1_delete(enghandle);
    	return;
	}
}

什么?没看到?那跟我没关系嗷。

五、后记

本人才疏学浅,千万别喷,谢谢,给你卖个萌嗷:

喵~!

————2020-2-8@燕卫博————

嵌入式视频处理芯片DM365:ARM9与硬件加速器的异构计算实践 在嵌入式系统设计中,异构计算是一种通过组合不同类型的处理单元(如通用CPU与专用硬件加速器)来高效执行特定任务的核心架构思想。其原理在于让通用处理器负责系统控制、任务调度等灵活工作,而将计算密集型的任务(如视频编解码)卸载给专用的固定功能硬件电路,从而实现高性能与低功耗的平衡。这种技术方案在视频监控、物联网设备等对实时性和能效要求苛刻的应用场景中价值显著。以德州仪器(TI)的TMS320DM365为例,这款经典的嵌入式媒体处理器正是这一理念的早期成功实践。它集成了ARM9内核作为控制核心,并配备了专用的高清 阅读详情

相关推荐

图像颜色空间理解

1.什么是颜色空间? 计算机系统中表示现实世界各种颜色的色彩模型。常用的颜色空间有RGB,BGR,CMY,YUV,HSI等。不同的色彩空间只是同一物理量的不同表示法。 2.RGB颜色空间 主要用于计算机图形学中,依据人眼识别的颜色创建,图像中每一个像素都具有R,G,B三个颜色分量组成,这三个分量大小均为[0,255]。通常表示某个颜色的时候,写成一个3维...

程序猿老樊的博客 3668

dm365 linux2.6.32内核实现656传输驱动lcd

/* * setting PAL mode */ static void davinci_enc_set_pal(struct vid_enc_mode_info *mode_info) { enableDigitalOutput(0); if (cpu_is_davinci_dm355()) { dispc_reg_out(VENC_CLKCTL, 0x1);

gejunxiao1的专栏 1869

告别龟速计算!用Python的fengwo模块5分钟搞定通达信COST/WINNER函数(附完整代码)

本文介绍如何使用Python的fengwo模块高效复现通达信的COST和WINNER函数,解决量化交易中的计算精度和性能问题。通过C++核心算法和多线程优化,计算速度提升显著,误差低于0.5%,并支持与通达信DLL无缝集成,适用于实盘交易策略开发。

weixin_42533751的博客 599

使用git管理代码(基础使用)

git:在本地建立仓库,可以存储代码的各个版本 github:一个提供Git 仓库托管服务的平台 即代码仓库 一、git的使用 1.官网下载:https://git-for-windows.github.io/ 2. 一路按next安装即可 3. 安装完成打开bash进行操作即可 ps: Git for Windows从2.8.0版本[3]开始,默认添加环境变量,所以环境变量部分就不用再手动配置了...

Dean_xiu的博客 4774

PaddleOCR实战:如何在CentOS 8.5上搭建高性能OCR识别环境

本文详细介绍了在CentOS 8.5系统上搭建高性能PaddleOCR识别环境的完整指南。从系统环境准备、PaddlePaddle框架部署到PaddleOCR的定制化安装与性能优化,提供了针对生产环境的解决方案,包括GPU/CPU环境配置、内核参数调优及常见问题排查,帮助用户实现高效OCR识别。

weixin_29223603的博客 349

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 375

【全网热点】打造全网最全爱心代码仓库【火速领取爱心】

打造全网最全爱心代码合集❤️,实现各种爱心动态效果,再也不怕女神找我要爱心代码了!目前采用HTML、C语言和Python语言实现,期待大家来一起创建更多好看的爱心代码······

@花无缺 9900

libfranka---joint_impendence_control例程分析

joint_impedance_control.cpp例程分析 部分内容来自链接,我个人以初学者的角度对代码进行了更加细致的解释。 核心部分: // Set and initialize trajectory parameters. const double radius = 0.05; const double vel_max = 0.25; const double acceleration_time = 2.0; const double run_time = 20.0; d

weixin_41567783的博客 1121

VCC-H266/X265/X264音视频编码开源实现的编译及测试

VCC-h266/X265/X264编译及测试说明

maofei47的博客 3540

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

本文详细介绍了基于PyTorch的轻量级语义通信系统LICRnet的实现,专注于图像压缩重建中的语义信息保留。通过深度可分离卷积、可变窗口多尺度注意力等创新技术,显著降低计算量并提升性能,特别适用于无人机巡检、远程医疗等物联网场景。文章包含完整的代码实现、训练策略及部署优化方案。

weixin_27697385的博客 220

华为OD机考真题 新系统 - 小菊的寻宝之旅(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【小菊的寻宝之旅】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小菊的寻宝之旅】多语言题解。

qq_45776114的博客 616

从零开始理解DM368的H264视频编码过程(上)

目录〇、前言一、DVSDK的结构和编码程序依赖1.DVSDK目录结构2.程序依赖二、DM368的视频处理子系统三、DM368的编码流程本文资料下载 〇、前言 本系列博客性质为个人学习笔记。记录了我如何从什么都不知道逐渐理解了DVSDK例程的过程。 相关环境搭建可参阅: 从零开始搭建DM368开发环境,安装DVSDK4_02_00_06并编译生成uboot、rootfs和kernel镜像 *本文并不...

Turix附属空间[已停用] 3235

从零到多智能体:Google Agent开发套件(ADK)入门指南

ADK促进自定义工具生产的能力是其优势之一。本质上,工具只是一个带有描述性文档字符串的Python函数。

独立开发,substack顶级编辑 2488

从零开始理解DM368的H264视频编码过程(中)

目录三、DM368视频编码程序main.c主线程capture.c捕获器线程video.c视频编码线程writer.c写线程ctrl.c控制线程删减后的demo.h文件内容删减后的ctrl.h文件内容删减后的capture.h内容删减后的video.h文件内容删减后的writer.h文件内容编译本篇后记 三、DM368视频编码程序 这部分中仅抽取了例程中有关视频编码部分的功能,删除了演示程序的一些...

Turix附属空间[已停用] 1137

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

对Davinci平台开发的一些感想

经过十个月的努力,终于成功在DM365上实现了两路D1+两路CIF的H264编码,在DM368上实现了四路D1+四路CIF的H264编码。在整个开发过程中,有愤怒,有无奈,也有喜悦,聊记下一点粗浅的看法。 一流的硬件 应当说,365和368的运算能力还是比较强悍的,性价比不错

嵌云阁 8025

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32使用HAL库驱动vl6180模块(Cubemx)

使用HAL库驱动vl6180模块寄存器地址I2C读写初始化函数测量 网上很多使用stm驱动vl6180模块的 但多半是使用自定义的i2c函数甚至是使用软件i2c,于是我便对其函数进行了修改以便使用HAL库驱动减少代码量也更方便 寄存器地址 我建立了一个头文件将模块中的寄存器地址进行了定义。 #define VL6180X_DEFAULT_ID 0xB4 #define VL6180X_DEFAULT_I2C_ADDR 0x29 #define VL6180X_REG_IDENTIFIC

snow_cx的博客 3549

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Streaming live H264 video from DM368

Appro already got a reference design on how to stream livevideo, but it's based on Appro's own framework. For people like mewho want to use DVSDK4, it's not very helpful. The Appro designalso used WIS

Sloan 3662

VideoCodec 入门篇 - 00 (编解码简介)

冗余信息指的是一帧或者多帧之间的多余信息,比如,一帧图片内的信息,很多都是蓝色,那么是否可以考虑用一个蓝色就来编码其他部分的内容信息呢?比如一个码流,有连续 N 帧的内容都是静止或者变化不多的,那这之间的每帧信息都有大量的重复冗余信息;

StephenZhou 3万+

视频编解码---x264用于编码,ffmpeg用于解码

项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时间。将自己的最终成果记录于此,期望会给其他人提供些许帮助。   参考教程: http://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide安装ffmpeg和x264,官方权威教程(注意不要用命令行安装,会少很多库的。编译安装最保险) http://blog.csdn

Follow excellent, success will chase you ! 9132

H.266 现状

H.266,即VVC,已于2020年6月完成标准化工作,其标准号为Rec. ITU-T H.266 and ISO/IEC 23090-3,标准将在2020年11月正式开始生效。H.266最显著的特点就是其相比起它前一代的标准,即ITU-T and ISO/IEC High Efficiency Video Coding (HEVC),标准号Rec. ITU-T H.265 and ISO/IEC 23008-2,有近50%的压缩性能的提升,而相比起更早的标准H.264/MPEG-4 AVC standar

轻舞飞扬 3632

基于DM642的X264开源代码实现的研究

基于DM642的X264开源代码实现的研究 文章发表于:2008-09-08 11:24 作者:谭超 王库 傅颖 来源:微计算机信息 摘要:本文概述了H.264视频压缩编码标准的主要特性,简要介绍了当前H.264的几种开源软件,详细分析了其中X264参考程序的具体结构,并针对TMS320DM642平台建议了可能的优化方向。 关键字:H.264;开源软件;X264;TMS

andoyu的专栏 1139

ColorSpace颜色空间简介

前言 如果看过之前的介绍的图像颜色迁移《color transfer between images》和颜色协调模型Color Harmoniztion就会发现,大部分图像处理算法虽然输入输出是RGB像素值,但是中间进行算法处理时很少直接更改RGB值,而是转换到其它空间,使得各颜色分量之间的影响越小越好,而RGB像素值互相影响比较严重,有文章研究发现当图像蓝色通道值比较大的时候,红绿通道值也比较大,不然会出现一些诡异的颜色。 为了更好地理解各类传统的图像算法理论,我们需要对色彩空间有一个大概的认识。 国际惯例

风翼冰舟的博客 1万+

流媒体-H264协议-编码-x264学习-主要结构体(二)

流媒体-H264协议-编码-x264学习-相关概念x264编译及文件解析(一) 文章目录写在前面:所有结构体属性意义内容可在:[ITU-T H.264建议书]查询libx264相关结构体x264_param_t 结构体cli_opt_t 结构体x264_level_t 结构体x264_image_t 结构体:存放一帧图像实际像素数据x264_image_properties_t 结构体x264_picture_t 结构体:描述一视频帧的特征x264_frame_t 结构体:图像帧编解码的相关参数x264_n

bwangk的博客 1667

H264基本概念之 色彩空间(RGB vs YUV)

      很早以前就知道RGB,三基色原理,即任何色彩都可以由红、绿、蓝混合而成,后来上了图像处理这门课才知道YUV(YCbCr)也是一种表示色彩的方式,只不过它是通过亮度和色度表示的。我猜想,如果色彩空间可以用三个独立的变量去表示,类似三维空间,那么通过建立不同的正交基,是完全可以对这个三维空间进行描述的,只是映射的方式不同而已,最重要的是找到有实际意义的物理表示。当对RGB进行压缩时,显然利

王贵平的专栏—分享学习的快乐,感悟人生的真谛! 7717
上一篇: 从零开始理解DM368的H264视频编码过程(中)
下一篇: 2020年3月7日的我
燕卫博
博客等级 码龄7年 312粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值