SDL显示视频图像

作用:用已存在的像素数据更新纹理
int SDL_UpdateTexture(SDL_Texture*    texture,//要更新的纹理
                      const SDL_Rect* rect,//要更新的区域,如果为NULL,则更新整个纹理
                      const void*     pixels,//已存在的像素值
                      int             pitch)//每一行像素所占字节数


// SDLButtonTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "BrButton.h"
#include <stdio.h>
#include <string.h>
#include "SDL.h"
#pragma comment(lib, "SDL.LIB")

//模拟视频流
struct
{
	Uint32  pixformat;//像素格式
	int     w, h;//宽高
	Uint8   *data;//像素数据
}frame;

int screen_width  = 0;
int screen_height = 0;
int status = 0; // 1: request to stop; 2: stop
SDL_Texture *p_texture = NULL;
SDL_Renderer *p_render = NULL;

static void quit(int rc)
{
	SDL_Quit();
	exit(rc);
}
//模拟像素数据
void fill_color_rgba8888()
{
	//r,g,b,a分别占8位,也就是一个字节
	static Uint8 r = 0, g = 0, b = 0, a = 0;
	//模拟RGBA变化
	r += 10, g += 15, b += 20, a += 5;
	//将模拟的值赋值给像素数据
	Uint32 *pdst = (Uint32 *)frame.data;
	Uint32 color = (r << 24) | (g << 16) | (b << 8) | a;
	//每个像素一个颜色值
	for (int i = 0; i < frame.w*frame.h; i++)
	{
		*pdst++ = color;
	}
}
//视频显示线程
int SDLCALL video_process(void * data)
{
	int ret; 
	while (1)
	{
		if (1 == status)    // request to stop
		{
			status = 2;
			break;
		}
		//使用模拟数据填充像素值
		fill_color_rgba8888();
		//使用像素值更新纹理
		ret = SDL_UpdateTexture(p_texture, NULL, frame.data, frame.w * 4);
		//清理渲染器
		ret = SDL_RenderClear(p_render);
		//从纹理复制到渲染器
		SDL_RenderCopy(p_render, p_texture, NULL, NULL);
		//更新渲染器显示
		SDL_RenderPresent(p_render);

		SDL_Delay(1000);
	}

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	//初始化SDL
	if (SDL_Init(SDL_INIT_VIDEO) < 0)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL Timer SubSystem: %s\n", SDL_GetError());
		quit(1);
	}

	screen_width = screen_height = 500;
	frame.w = frame.h = 300;
	frame.pixformat = SDL_PIXELFORMAT_RGBA8888;//像素格式
	frame.data = (Uint8 *)calloc(frame.w*frame.h*4, 1); //一个像素颜色值需要4个字节(32位:r8,g8,b8,a8)
	//创建窗口
	SDL_Window *p_screen;
	p_screen = SDL_CreateWindow("video test",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		screen_width, screen_height, SDL_WINDOW_RESIZABLE);
	if (NULL == p_screen)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window: %s\n", SDL_GetError());
		quit(2);
	}
	//创建渲染器
	p_render = SDL_CreateRenderer(p_screen, -1, 0);
	if (NULL == p_render)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s\n", SDL_GetError());
		quit(3);
	}
	//创建纹理
	p_texture = SDL_CreateTexture(p_render, frame.pixformat, SDL_TEXTUREACCESS_STREAMING, frame.w, frame.h);
	if (NULL == p_texture)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
		quit(4);
	}

	//启动线程模拟视频数据更新
	SDL_Thread *video_thread = SDL_CreateThread(video_process, NULL, NULL);

	//消息循环
	SDL_Event event;
	while (status != 2)
	{
		SDL_WaitEvent(&event);
		switch (event.type)
		{
		case SDL_QUIT:
			status = 1;
			break;
		}
	}

	//清理
	SDL_DestroyTexture(p_texture);
	SDL_DestroyRenderer(p_render);
	SDL_DestroyWindow(p_screen);
	free(frame.data);
	SDL_Quit();
	return 0;
}
参考:http://blog.csdn.net/finewind/article/details/41515443

你可能感兴趣的:(SDL显示视频图像)