x265-1.8版本-common/yuv.h注释

注:问号以及未注释部分 会在x265-1.9版本内更新

/*****************************************************************************
 * Copyright (C) 2015 x265 project
 *
 * Authors: Steve Borho <steve@borho.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
 *
 * This program is also available under a commercial proprietary license.
 * For more information, contact us at license @ x265.com.
 *****************************************************************************/

#ifndef X265_YUV_H
#define X265_YUV_H

#include "common.h"
#include "primitives.h"

namespace X265_NS {
// private namespace

class ShortYuv;
class PicYuv;

/* A Yuv instance holds pixels for a square CU (64x64 down to 8x8) for all three planes
 * these are typically used to hold fenc, predictions, or reconstructed blocks */
class Yuv
{
public:

    pixel*   m_buf[3];       //存储空间

    uint32_t m_size;         //当前yuv的size大小,一般是一个CTU 大小为64
    uint32_t m_csize;        //当前yuv色度的size大小,一般是一个CTU 大小为64
    int      m_part;         // cached partition enum size 当前块标号:如:LUMA_4x4,   LUMA_8x8,   LUMA_16x16, LUMA_32x32, LUMA_64x64....

    int      m_csp;          //图像格式 420、444:400
    int      m_hChromaShift; //根据图像格式,色度宽度需要移位个数 如420格式 就是1
    int      m_vChromaShift; //根据图像格式,色度高度需要移位个数 如420格式 就是1
    /** 函数功能    :初始化YUV
    * \返回值       :null */
    Yuv(); 
    /** 函数功能   : 初始化数据,并申请空间内存
    /*\参数    size: 申请空间大小的size
    * \参数     csp:  图像格式
    * \返回        : 是否申请内存成功 */
    bool   create(uint32_t size, int csp);
    /** 函数功能   : 释放空间内存
    * \返回        : null */
    void   destroy();

    // Copy YUV buffer to picture buffer
    void   copyToPicYuv(PicYuv& destPicYuv, uint32_t cuAddr, uint32_t absPartIdx) const;

    // Copy YUV buffer from picture buffer
    void   copyFromPicYuv(const PicYuv& srcPicYuv, uint32_t cuAddr, uint32_t absPartIdx);

    // Copy from same size YUV buffer
    void   copyFromYuv(const Yuv& srcYuv);

    // Copy portion of srcYuv into ME prediction buffer
    void   copyPUFromYuv(const Yuv& srcYuv, uint32_t absPartIdx, int partEnum, bool bChroma);

    // Copy Small YUV buffer to the part of other Big YUV buffer
    /** 函数功能       : 将源数据按照标号位置的部分copy到目标yuv中
    * \参数 dstYuv     : 目标yuv存储地址
    * \参数 absPartIdx : 当前CU在LCU中4x4 zizag地址
    *   返回值         : null**/
    void   copyToPartYuv(Yuv& dstYuv, uint32_t absPartIdx) const;

    // Copy the part of Big YUV buffer to other Small YUV buffer
    void   copyPartToYuv(Yuv& dstYuv, uint32_t absPartIdx) const;

    // Clip(srcYuv0 + srcYuv1) -> m_buf .. aka recon = clip(pred + residual)
    void   addClip(const Yuv& srcYuv0, const ShortYuv& srcYuv1, uint32_t log2SizeL);

    // (srcYuv0 + srcYuv1)/2 for YUV partition (bidir averaging)
    void   addAvg(const ShortYuv& srcYuv0, const ShortYuv& srcYuv1, uint32_t absPartIdx, uint32_t width, uint32_t height, bool bLuma, bool bChroma);

    void copyPartToPartLuma(Yuv& dstYuv, uint32_t absPartIdx, uint32_t log2Size) const;
    void copyPartToPartChroma(Yuv& dstYuv, uint32_t absPartIdx, uint32_t log2SizeL) const;
    /** 函数功能       : 获取当前亮度当前PU的地址
    * \参数 absPartIdx : 当前块相对于当前CU的zigzag标号
    *   返回值         : 返回当前亮度当前PU的地址**/
    pixel* getLumaAddr(uint32_t absPartIdx)                      { return m_buf[0] + getAddrOffset(absPartIdx, m_size); }
    /** 函数功能       : 获取当前色度当前PU的地址
    * \参数 absPartIdx : 当前块相对于当前CU的zigzag标号
    *   返回值         : 返回当前色度当前PU的地址**/
    pixel* getCbAddr(uint32_t absPartIdx)                        { return m_buf[1] + getChromaAddrOffset(absPartIdx); }
    /** 函数功能       : 获取当前色度当前PU的地址
    * \参数 absPartIdx : 当前块相对于当前CU的zigzag标号
    *   返回值         : 返回当前色度当前PU的地址**/
    pixel* getCrAddr(uint32_t absPartIdx)                        { return m_buf[2] + getChromaAddrOffset(absPartIdx); }
    pixel* getChromaAddr(uint32_t chromaId, uint32_t absPartIdx) { return m_buf[chromaId] + getChromaAddrOffset(absPartIdx); }
    /** 函数功能       : 获取当前亮度当前PU的地址
    * \参数 absPartIdx : 当前块相对于当前CU的zigzag标号
    *   返回值         : 返回当前亮度当前PU的地址**/
    const pixel* getLumaAddr(uint32_t absPartIdx) const                      { return m_buf[0] + getAddrOffset(absPartIdx, m_size); }
    const pixel* getCbAddr(uint32_t absPartIdx) const                        { return m_buf[1] + getChromaAddrOffset(absPartIdx); }
    const pixel* getCrAddr(uint32_t absPartIdx) const                        { return m_buf[2] + getChromaAddrOffset(absPartIdx); }
    const pixel* getChromaAddr(uint32_t chromaId, uint32_t absPartIdx) const { return m_buf[chromaId] + getChromaAddrOffset(absPartIdx); }
    /** 函数功能       : 获取当前块左上角zigzag标号位置相对当前CU首地址的色度偏移量
    * \参数 absPartIdx : 当前块相对于当前CU的zigzag标号
    * \参数 width      : yuv的宽度(可以理解为步长)
    *   返回值         : 返回当前块左上角zigzag标号位置相对当前CU首地址的色度偏移量**/
    int getChromaAddrOffset(uint32_t absPartIdx) const
    {
        int blkX = g_zscanToPelX[absPartIdx] >> m_hChromaShift;
        int blkY = g_zscanToPelY[absPartIdx] >> m_vChromaShift;

        return blkX + blkY * m_csize;
    }
    /** 函数功能       : 获取当前块左上角zigzag标号位置相对当前CU首地址的偏移量
    * \参数 absPartIdx : 当前块相对于当前CU的zigzag标号
    * \参数 width      : yuv的宽度(可以理解为步长)
    *   返回值         : 返回当前块左上角zigzag标号位置相对当前CU首地址的偏移量**/
    static int getAddrOffset(uint32_t absPartIdx, uint32_t width)
    {
        int blkX = g_zscanToPelX[absPartIdx];
        int blkY = g_zscanToPelY[absPartIdx];

        return blkX + blkY * width;
    }
};
}

#endif


 

<think>我们正在处理一个内核编译错误,错误信息是:`Makefile.modbuiltin:Nosuch fileor directory`,具体路径是`drivers/misc/mediatek/imgsensor/src/ac8257/../common/v1/max9286_yuv/Makefile`。首先,我们需要理解这个错误。这个错误发生在编译内核模块时,make工具在尝试读取`Makefile.modbuiltin`文件时失败,因为它找不到该文件。错误信息中提到的路径是`drivers/misc/mediatek/imgsensor/src/ac8257/../common/v1/max9286_yuv/Makefile`,这可能是导致问题的Makefile的路径。根据错误信息,我们可以推断: 1.编译过程中,make工具在某个步骤需要包含`Makefile.modbuiltin`文件,但是该文件不存在。2.错误信息中提到的路径可能是一个相对路径,它指向一个Makefile,这个Makefile可能是问题的根源。在Linux内核编译中,`Makefile.modbuiltin`是一个生成的文件,它用于构建内置模块(built-inmodules)。如果这个文件缺失,可能是由于配置错误或路径问题。 解决步骤:1.**检查路径是否存在**:-首先,我们需要确认错误信息中提到的路径是否存在。具体路径是:`drivers/misc/mediatek/imgsensor/src/ac8257/../common/v1/max9286_yuv/Makefile`。-注意:`ac8257/..`表示上一级目录,所以实际路径是`drivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv/Makefile`。-进入内核源码目录,检查这个路径下是否存在`Makefile`文件。 2. **检查Makefile内容**:-如果该Makefile存在,检查其内容是否正确。特别是,它是否正确地引用了其他文件(比如`Makefile.modbuiltin`)?但是注意,通常`Makefile.modbuiltin`是由内核构建系统自动生成的,不应该在驱动目录的Makefile中直接引用。 3. **检查内核配置**:-确保配置中启用了该模块。检查`.config`文件中是否有对应的配置项(例如`CONFIG_...`)。如果该模块没有被配置为内置(`y`)或模块(`m),那么可能不会生成相应的Makefile.modbuiltin。4.**清理和重新生成配置**:-执行`makeclean`或`make mrproper`(注意:mrproper会删除所有配置文件,包括.config,所以谨慎使用)来清理编译生成的文件。-然后重新配置内核,确保相关驱动被正确配置。5.**检查文件权限**:-确保所有相关文件具有可读权限。6.**检查内核版本和补丁**:-如果内核树不完整(例如,缺少某些补丁),可能导致文件缺失。确保你使用的内核源码是完整的,并且已经打上所有必要的补丁。 根据错误信息,我们还可以参考之前的引用[^1]中提到的类似错误。在引用[^1]中,错误发生在安装模块(`make modules_install`)时,而我们的错误发生在编译过程中。但两者都涉及Makefile的问题。 在引用[^2]中,我们看到了一些关于摄像头驱动修改和编译的步骤,这可能与当前问题相关,因为错误路径涉及`imgsensor`(图像传感器)驱动。所以,如果之前修改了摄像头驱动的代码,可能需要检查这些修改是否影响了Makefile。具体到我们的错误,可能是由于以下原因:-在`max9286_yuv`目录下的Makefile中可能包含了一个对`Makefile.modbuiltin`的引用,但这个文件在内核编译的早期阶段还没有生成。 -或者,该Makefile的路径在构建系统中配置错误。**解决方案尝试**:1.首先,进入内核源码目录,检查路径`drivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv/`下是否存在`Makefile`文件。-如果不存在,那么可能是代码拉取不完整,需要补全该文件。-如果存在,检查其内容。2.查看该Makefile的内容,看看是否有明显的错误(比如错误的路径引用)。 3.尝试在配置中禁用该模块(如果暂时不需要),看是否能够通过编译。4.如果问题仍然存在,可以尝试在内核源码树的根目录下搜索`Makefile.modbuiltin`文件,看它通常在哪里生成。正常情况下,这个文件应该在每个子目录的构建过程中生成。如果某个子目录没有生成,可能是因为该目录没有配置为参与构建。 5.检查内核的`Kconfig`文件,确保`max9286_yuv`驱动对应的配置项被正确设置,并且其依赖项都满足。6.如果该驱动是新增的,可能需要将其添加到父目录的Makefile和Kconfig中,以便构建系统识别。根据错误信息,错误发生在`modinst`目标(安装模块)时,但我们的错误信息是`Makefile.modbuiltin`缺失。这可能是构建过程中的不同阶段。但我们可以参考类似错误的解决方法。 在引用[^1]中,错误的解决可能是通过修复Makefile路径或确保相关文件存在。因此,我们也可以尝试:-确保内核源码树完整,没有缺失文件。-如果该驱动是第三方添加的,检查其添加方式是否正确。**具体操作**: 假设我们位于内核源码根目录:1.检查文件是否存在:```bashlsdrivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv/Makefile``` 2.如果存在,检查其内容:```bashcat drivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv/Makefile```正常的内容应该类似于:```makefileobj-$(CONFIG_VIDEO_MAX9286)+= max9286.o```3.检查配置:在`.config`文件中查找`CONFIG_VIDEO_MAX9286`(或类似名字)的配置项,确保它是`y`或`m`。4.如果文件不存在,则需要从其他地方复制或重新获取该文件。5.如果文件存在,配置也正确,那么可能是构建系统的问题。尝试清理并重新编译:```bashmake cleanmake```6.如果问题依旧,可以尝试手动创建该目录下的`Makefile.modbuiltin`文件(通常为空)?但这不是标准做法。更好的方法是检查构建日志,看为什么没有生成该文件。 7.另一种可能性:内核构建系统要求每个子目录的Makefile必须符合一定的格式。如果该Makefile格式错误,可能导致构建系统无法生成`Makefile.modbuiltin`。可以对比其他正常目录的Makefile。8.如果该驱动不是必须的,可以在配置中将其禁用。 **注意**:由于错误信息中提到了`Makefile.modbuiltin`,这个文件是由内核构建系统自动生成的,它汇总了该目录下所有要构建的内置对象。因此,如果该目录下没有有效的目标(例如,没有配置为`y`的模块),那么可能不会生成这个文件。但是错误信息说“Nosuch fileor directory”,所以可能是构建系统期望该文件存在但实际上不存在。这可能是由于该目录在`obj-y`或`obj-m`中列出,但该目录下的Makefile没有生成任何目标(因为配置没打开)。因此,检查父目录的Makefile,看是否包含了`max9286_yuv`目录。例如,在`drivers/misc/mediatek/imgsensor/src/common/v1/Makefile`中,可能有这样一行:```makefileobj-y+= max9286_yuv/ ```如果存在这一行,那么即使`max9286_yuv`目录下没有配置任何模块,构建系统也会尝试进入该目录并构建。但此时,如果`max9286_yuv`目录下的Makefile没有定义任何`obj-$(CONFIG_...)`的目标,那么构建系统可能不会生成`Makefile.modbuiltin`,从而导致错误。 因此,解决方案可能是: -在父目录的Makefile中,根据配置条件地包含`max9286_yuv`目录。例如:```makefileobj-$(CONFIG_VIDEO_MAX9286) +=max9286_yuv/```-或者在`max9286_yuv`的Makefile中确保至少有一个目标被配置为`y`或`m`。综上所述,请按照上述步骤检查并修复。如果问题仍然无法解决,请提供更多的上下文信息,例如内核版本、完整的错误日志等。</think>### 解决内核编译中Makefile路径错误问题 您遇到的错误`Makefile.modbuiltin: No such file or directory`通常是由内核编译系统中的路径配置问题导致的。以下是系统的解决步骤: #### 1. **验证Makefile路径是否存在** ```bash # 进入内核源码目录 cd kernel-3.10 # 检查报错路径的真实位置 realpath drivers/misc/mediatek/imgsensor/src/ac8257/../common/v1/max9286_yuv/Makefile ``` - 如果路径不存在,说明文件缺失或路径错误 - 如果路径存在,检查文件权限:`ls -l <完整路径>` #### 2. **修复路径引用问题** 错误中的路径`ac8257/../common/v1`表明使用了相对路径引用。建议修改为: ```makefile # 在父级Makefile中修改引用方式(如drivers/misc/mediatek/imgsensor/src/Makefile) obj-y += common/v1/max9286_yuv/ # 使用绝对路径替代相对路径 ``` #### 3. **检查Kconfig配置链** 确保驱动配置已正确启用: ```bash make menuconfig ``` 导航路径: `Device Drivers → Misc devices → MediaTek camera sensor drivers → MAX9286 YUV support` 确认是否选中`<M>`或`<*>`,未启用会导致Makefile不被处理。 #### 4. **清理并重新生成配置** ```bash make clean make mrproper # 彻底清理 cp /备份路径/.config . # 恢复配置 make oldconfig ``` #### 5. **补丁修复(若文件缺失)** 如果确认文件缺失: ```bash # 从源码仓库恢复文件 git checkout -- drivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv/Makefile # 或手动创建基础Makefile echo "obj-\$(CONFIG_MTK_CAMERA_MAX9286) += max9286_yuv.o" > drivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv/Makefile ``` #### 6. **验证驱动编译** 单独编译问题模块: ```bash make M=drivers/misc/mediatek/imgsensor/src/common/v1/max9286_yuv ``` - 成功:说明路径问题已解决 - 失败:查看具体错误信息 ### 根本原因分析 此错误通常由以下原因导致: 1. **相对路径误用**:Linux内核编译系统对`../`类相对路径支持不稳定 2. **配置链断裂**:驱动未在Kconfig中正确声明依赖关系 3. **源码不完整**:文件未纳入版本控制或同步遗漏 4. **交叉编译污染**:残留文件导致路径解析失败[^1] > 建议优先使用`git status`检查文件状态,90%的类似错误可通过路径规范化和配置验证解决[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值