这就创建了一个给定高度和宽度的屏幕。下一个选项是屏幕的颜色深度――0 表
示使用和当前一样的深度。(这个在 OS X 系统上不能正常工作,原因请看源代
码)
现在我们在屏幕上来创建一个 YUV覆盖以便于我们输入视频上去:
*bmp; bmp = SDL_CreateYUVOverlay(pCodecCtx->width,
SDL_YV12_OVERLAY,
pCodecCtx->height,
screen);
正如前面我们所说的,我们使用 YV12来显示图像。
前面那些都是很简单的。现在我们需要来显示图像。让我们看一下是如何来处理
完成后的帧的。我们将原来对 RGB处理的方式,并且替换 SaveFrame() 为显示
到屏幕上的代码。为了显示到屏幕上,我们将先建立一个 AVPicture结构体并且
设置其数据指针和行尺寸来为我们的 YUV覆盖服务:
SDL_LockYUVOverlay(bmp);
pict.data[0] = bmp->pixels[0]; pict.data[1] =
bmp->pixels[2];
bmp->pixels[1];
bmp->pitches[0];
bmp->pitches[2];
pict.linesize[0] =
pict.linesize[1] =
pict.linesize[2] = bmp->pitches[1];
img_convert(&pict,
(AVPicture *)pFrame,
pCodecCtx->width,
SDL_UnlockYUVOverlay(bmp); }
the image into YUV format that SDL uses
pCodecCtx->pix_fmt,
pCodecCtx->height);
首先,我们锁定这个覆盖,因为我们将要去改写它。这是一个避免以后发生问题
的好习惯。正如前面所示的,这个 AVPicture结构体有一个数据指针指向一 个
有 4 个元素的指针数据。由于我们处理的是 YUV420P,所以我们只需要 3 个通道
即只要三组数据。其它的格式可能需要第四个指针来表示 alpha通道或 者其它
参数。行尺寸正如它的名字表示的意义一样。在 YUV覆盖中相同功能的结构体是
像素 pixel和程度 pitch。(程度 pitch是在 SDL里用来表 示指定行数据宽度
的值)。所以我们现在做的是让我们的覆盖中的 pict.data中的三个指针有一个
指向必要的空间的地址。类似的,我们可以直接从覆盖中得到行尺寸信息。像 前
面一样我们使用 img_convert来把格式转换成 PIX_FMT_YUV420P。
但我们仍然需要告诉 SDL如何来实际显示我们给的数据。我们也会传递一个表明
电影位置、宽度、高度和缩放大小的矩形参数给 SDL的函数。这样,SDL为我 们
做缩放并且它可以通过显卡的帮忙来进行快速缩放。
SDL_Rect rect; if(frameFinished) {
// Convert the image into YUV