青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

Image Stride (Windows)

轉載自:http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa473780(v=vs.85).aspx

When a video image is stored in memory, the memory buffer might contain extra padding bytes after each row of pixels. The padding bytes affect how the image is stored in memory, but do not affect how the image is displayed.

The stride is the number of bytes from one row of pixels in memory to the next row of pixels in memory. Stride is also called pitch. If padding bytes are present, the stride is wider than the width of the image, as shown in the following illustration.

Diagram showing an image plus padding.

Two buffers that contain video frames with equal dimensions can have two different strides. If you process a video image, you must take the stride into account.

In addition, there are two ways that an image can be arranged in memory. In a top-down image, the top row of pixels in the image appears first in memory. In a bottom-up image, the last row of pixels appears first in memory. The following illustration shows the difference between a top-down image and a bottom-up image.

Diagram showing top-down and bottom-up images.

A bottom-up image has a negative stride, because stride is defined as the number of bytes need to move down a row of pixels, relative to the displayed image. YUV images should always be top-down, and any image that is contained in a Direct3D surface must be top-down. RGB images in system memory are usually bottom-up.

Video transforms in particular need to handle buffers with mismatched strides, because the input buffer might not match the output buffer. For example, suppose that you want to convert a source image and write the result to a destination image. Assume that both images have the same width and height, but might not have the same pixel format or the same image stride.

The following example code shows a generalized approach for writing this kind of function. This is not a complete working example, because it abstracts many of the specific details.

void ProcessVideoImage(
    BYTE*       pDestScanLine0,     
    LONG        lDestStride,        
    const BYTE* pSrcScanLine0,      
    LONG        lSrcStride,         
    DWORD       dwWidthInPixels,     
    DWORD       dwHeightInPixels
    )
{
    for (DWORD y = 0; y < dwHeightInPixels; y++)
    {
        SOURCE_PIXEL_TYPE *pSrcPixel = (SOURCE_PIXEL_TYPE*)pDestScanLine0;
        DEST_PIXEL_TYPE *pDestPixel = (DEST_PIXEL_TYPE*)pSrcScanLine0;

        for (DWORD x = 0; x < dwWidthInPixels; x +=2)
        {
            pDestPixel[x] = TransformPixelValue(pSrcPixel[x]);
        }
        pDestScanLine0 += lDestStride;
        pSrcScanLine0 += lSrcStride;
    }
}

This function takes six parameters:

  • A pointer to the start of scan line 0 in the destination image.
  • The stride of the destination image.
  • A pointer to the start of scan line 0 in the source image.
  • The stride of the source image.
  • The width of the image in pixels.
  • The height of the image in pixels.

The general idea is to process one row at a time, iterating over each pixel in the row. Assume that SOURCE_PIXEL_TYPE and DEST_PIXEL_TYPE are structures representing the pixel layout for the source and destination images, respectively. (For example, 32-bit RGB uses the RGBQUAD structure. Not every pixel format has a predefined structure.) Casting the array pointer to the structure type enables you to access the RGB or YUV components of each pixel. At the start of each row, the function stores a pointer to the row. At the end of the row, it increments the pointer by the width of the image stride, which advances the pointer to the next row.

This example calls a hypothetical function named TransformPixelValue for each pixel. This could be any function that calculates a target pixel from a source pixel. Of course, the exact details will depend on the particular task. For example, if you have a planar YUV format, you must access the chroma planes independently from the luma plane; with interlaced video, you might need to process the fields separately; and so forth.

To give a more concrete example, the following code converts a 32-bit RGB image into an AYUV image. The RGB pixels are accessed using an RGBQUAD structure, and the AYUV pixels are accessed using a DXVA2_AYUVSample8 structure structure.

//-------------------------------------------------------------------
// Name: RGB32_To_AYUV
// Description: Converts an image from RGB32 to AYUV
//-------------------------------------------------------------------
void RGB32_To_AYUV(
    BYTE*       pDest,
    LONG        lDestStride,
    const BYTE* pSrc,
    LONG        lSrcStride,
    DWORD       dwWidthInPixels,
    DWORD       dwHeightInPixels
    )
{
    for (DWORD y = 0; y < dwHeightInPixels; y++)
    {
        RGBQUAD             *pSrcPixel = (RGBQUAD*)pSrc;
        DXVA2_AYUVSample8   *pDestPixel = (DXVA2_AYUVSample8*)pDest;
        
        for (DWORD x = 0; x < dwWidthInPixels; x++)
        {
            pDestPixel[x].Alpha = 0x80;
            pDestPixel[x].Y = RGBtoY(pSrcPixel[x]);   
            pDestPixel[x].Cb = RGBtoU(pSrcPixel[x]);   
            pDestPixel[x].Cr = RGBtoV(pSrcPixel[x]);   
        }
        pDest += lDestStride;
        pSrc += lSrcStride;
    }
}

The next example converts a 32-bit RGB image to a YV12 image. This example shows how to handle a planar YUV format. (YV12 is a planar 4:2:0 format.) In this example, the function maintains three separate pointers for the three planes in the target image. However, the basic approach is the same as the previous example.

void RGB32_To_YV12(
    BYTE*       pDest,
    LONG        lDestStride,
    const BYTE* pSrc,
    LONG        lSrcStride,
    DWORD       dwWidthInPixels,
    DWORD       dwHeightInPixels
    )
{
    assert(dwWidthInPixels % 2 == 0);
    assert(dwHeightInPixels % 2 == 0);

    const BYTE *pSrcRow = pSrc;
    
    BYTE *pDestY = pDest;

    // Calculate the offsets for the V and U planes.

    // In YV12, each chroma plane has half the stride and half the height  
    // as the Y plane.
    BYTE *pDestV = pDest + (lDestStride * dwHeightInPixels);
    BYTE *pDestU = pDest + 
                   (lDestStride * dwHeightInPixels) + 
                   ((lDestStride * dwHeightInPixels) / 4);

    // Convert the Y plane.
    for (DWORD y = 0; y < dwHeightInPixels; y++)
    {
        RGBQUAD *pSrcPixel = (RGBQUAD*)pSrcRow;
        
        for (DWORD x = 0; x < dwWidthInPixels; x++)
        {
            pDestY[x] = RGBtoY(pSrcPixel[x]);    // Y0
        }
        pDestY += lDestStride;
        pSrcRow += lSrcStride;
    }

    // Convert the V and U planes.

    // YV12 is a 4:2:0 format, so each chroma sample is derived from four 
    // RGB pixels.
    pSrcRow = pSrc;
    for (DWORD y = 0; y < dwHeightInPixels; y += 2)
    {
        RGBQUAD *pSrcPixel = (RGBQUAD*)pSrcRow;
        RGBQUAD *pNextSrcRow = (RGBQUAD*)(pSrcRow + lSrcStride);

        BYTE *pbV = pDestV;
        BYTE *pbU = pDestU;

        for (DWORD x = 0; x < dwWidthInPixels; x += 2)
        {
            // Use a simple average to downsample the chroma.

            *pbV++ = ( RGBtoV(pSrcPixel[x]) +
                       RGBtoV(pSrcPixel[x + 1]) +       
                       RGBtoV(pNextSrcRow[x]) +         
                       RGBtoV(pNextSrcRow[x + 1]) ) / 4;        

            *pbU++ = ( RGBtoU(pSrcPixel[x]) +
                       RGBtoU(pSrcPixel[x + 1]) +       
                       RGBtoU(pNextSrcRow[x]) +         
                       RGBtoU(pNextSrcRow[x + 1]) ) / 4;    
        }
        pDestV += lDestStride / 2;
        pDestU += lDestStride / 2;
        
        // Skip two lines on the source image.
        pSrcRow += (lSrcStride * 2);
    }
}

In all of these examples, it is assumed that the application has already determined the image stride. You can sometimes get this information from the media buffer. Otherwise, you must calculate it based on the video format. For more information about calculating image stride and working with media buffers for video, see Uncompressed Video Buffers.

Related topics

Video Media Types
Media Types

posted on 2013-01-25 10:07 楊粼波 閱讀(965) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性8sex亚洲区入口| 久久精品盗摄| 国产精品第一区| 亚洲视频在线一区观看| 99视频在线精品国自产拍免费观看| 美女精品在线观看| 99综合精品| 亚洲视频专区在线| 国产精品专区一| 久久久久久久91| 久久亚洲捆绑美女| 一个人看的www久久| 99国产精品久久久| 国产精品爽黄69| 麻豆91精品| 欧美黄在线观看| 亚洲欧美日韩国产成人| 亚洲欧美在线免费观看| 激情成人av在线| 亚洲欧洲一区| 国产精品视频1区| 你懂的一区二区| 欧美网站在线| 欧美插天视频在线播放| 欧美激情中文字幕一区二区| 亚洲欧美日韩国产综合精品二区 | 亚洲精品网站在线播放gif| 亚洲国产精品黑人久久久| 欧美日韩国产小视频| 久久国产天堂福利天堂| 免费日韩成人| 欧美一区日本一区韩国一区| 久久综合伊人77777蜜臀| 一区在线视频观看| 亚洲国产免费| 日韩午夜av| 亚洲欧美色婷婷| 亚洲欧洲精品一区二区三区 | 亚洲精品色婷婷福利天堂| 一区二区免费在线播放| 一区二区三区我不卡| 亚洲精品系列| 在线观看精品视频| 午夜精品婷婷| 亚洲一区二区三区四区五区午夜| 久久精品视频导航| 欧美一区国产二区| 欧美激情一区二区久久久| 久久青青草综合| 国产精品女人毛片| 亚洲日本免费电影| 在线看欧美视频| 欧美亚洲在线观看| 亚洲欧美成人综合| 欧美日韩中文字幕日韩欧美| 欧美高清视频一区二区| 激情久久五月| 欧美一区国产一区| 午夜综合激情| 国产精品网站在线观看| 日韩写真视频在线观看| 一本到12不卡视频在线dvd| 狼狼综合久久久久综合网| 久久久xxx| 国产偷国产偷亚洲高清97cao | 快播亚洲色图| 国产精品女主播一区二区三区| 亚洲精品国产日韩| 日韩午夜av在线| 欧美精品不卡| 亚洲人久久久| 日韩视频免费在线| 欧美精品一区二区在线播放| 欧美国产一区二区三区激情无套| 狠狠色丁香婷婷综合久久片| 欧美在线视频网站| 免费91麻豆精品国产自产在线观看| 国内成+人亚洲| 另类图片国产| 最新高清无码专区| 亚洲一区二区三区精品视频| 欧美日韩综合在线| 亚洲综合999| 久久视频精品在线| 亚洲第一在线综合网站| 欧美风情在线观看| 亚洲调教视频在线观看| 欧美在线观看天堂一区二区三区 | 欧美成人精品福利| 亚洲精品久久嫩草网站秘色| 亚洲午夜在线| 国产精品一区免费视频| 久久av免费一区| 欧美激情区在线播放| 亚洲视频在线观看免费| 国产精品五月天| 久久午夜电影| 国产精品99久久久久久人| 久久久最新网址| 9l国产精品久久久久麻豆| 国产精品综合久久久| 久久视频一区| 一区二区欧美激情| 久久亚洲不卡| 亚洲综合清纯丝袜自拍| 一区在线观看| 国产精品一区二区在线观看不卡| 久久精品中文| 一区二区三区四区在线| 女人色偷偷aa久久天堂| 亚洲午夜一区二区| 在线观看av不卡| 国产精品成人一区二区三区吃奶 | 欧美顶级艳妇交换群宴| 亚洲欧美偷拍卡通变态| 亚洲国产一区二区三区在线播| 欧美午夜精品电影| 欧美/亚洲一区| 性欧美videos另类喷潮| 亚洲理论在线| 欧美激情视频在线免费观看 欧美视频免费一| 一本色道久久综合狠狠躁的推荐| 激情综合亚洲| 国产精品一区二区三区久久| 欧美成人精品高清在线播放| 欧美有码在线观看视频| 在线一区二区三区做爰视频网站| 免费美女久久99| 欧美在线免费播放| 亚洲无线一线二线三线区别av| 亚洲国产成人在线| 精品成人一区二区三区四区| 国产精品高潮呻吟| 欧美日韩国产精品自在自线| 久久影院午夜论| 久久精品91| 久久精品视频免费播放| 小辣椒精品导航| 亚洲欧美日韩国产精品| 一本到高清视频免费精品| 亚洲国产精品第一区二区| 男女激情久久| 久久综合国产精品| 久久在线91| 蜜臀91精品一区二区三区| 久久成人这里只有精品| 欧美一区深夜视频| 久久激情婷婷| 久久亚洲影院| 欧美韩国一区| 亚洲国产精品va在看黑人| 欧美高清视频一二三区| 欧美激情在线观看| 亚洲国产精品精华液2区45| 亚洲福利在线视频| 亚洲精品视频在线观看网站| 亚洲欧洲一区二区天堂久久| 亚洲精品一二| 一区二区电影免费在线观看| 艳女tv在线观看国产一区| 一区二区欧美亚洲| 午夜免费日韩视频| 久久精品人人做人人综合| 麻豆精品视频在线观看| 欧美成人在线网站| 国产精品久久激情| 国模大胆一区二区三区| 亚洲国产欧美日韩另类综合| 一本色道久久88综合日韩精品| 亚洲在线中文字幕| 久久精品亚洲精品| 欧美搞黄网站| 中文久久精品| 久久久午夜精品| 欧美日韩国产亚洲一区| 国产麻豆日韩欧美久久| 狠狠综合久久av一区二区老牛| 亚洲激情成人网| 性欧美18~19sex高清播放| 六月婷婷久久| 99国内精品久久| 久久美女性网| 欧美午夜在线观看| 亚洲福利在线观看| 亚洲欧美综合v| 亚洲电影免费在线| 亚洲欧美日韩国产综合精品二区| 久久久久久久综合狠狠综合| 欧美三级视频在线播放| 在线日韩视频| 香蕉久久夜色精品国产| 亚洲高清久久网| 欧美一区二区视频在线观看2020| 欧美刺激午夜性久久久久久久| 国产精品久久午夜夜伦鲁鲁| 亚洲国产视频一区二区| 羞羞视频在线观看欧美| 亚洲免费av网站| 久久琪琪电影院| 国产一区二区三区自拍|