ARGB32 to YUV12 利用 SDL1.2 SDL_ttf 在视频表面输出文本

提示:ARGB alpha通道的A + 原YUV表面的y0 + 要写进去的y1 = 计算出新的y2.

计算公式为 ( y1 * a + y0 * ( 255 - a ) ) / 255

void  rgb2yuv(int r, int g, int b, int *y, int *u, int *v)
{
	int y0, u0, v0;

	y0 =  66*r + 129*g +  25*b;
	u0 = -38*r + -74*g + 112*b;
	v0 = 112*r + -94*g + -18*b;

	y0 = (y0+128)>>8;
	u0 = (u0+128)>>8;
	v0 = (v0+128)>>8;

	*y = y0 + 16;
	*u = u0 + 128;
	*v = v0 + 128;
}

void  yuv2rgb(int y, int u, int v, int *r, int *g, int *b)
{
	int r0,g0,b0;
	v = v - 128;
	u = u - 128;
	r0 = y + v + (v>>2) + (v>>3) + (v>>5);
	g0 = y - ((u>>2) + (u>>4) + (u>>5)) - ((v>>1) + (v>>3) + (v>>4) + (v>>5));
	b0 = y + u + (u>>1) + (u>>2) + (u>>6);

	*r = r0 > 255 ? 255: r0;
	*g = g0 > 255 ? 255: g0;
	*b = b0 > 255 ? 255: b0;
}

int blitSurface2YUV(SDL_Surface *src, SDL_Overlay *dst, SDL_Rect *dstrect ,int isBlended)
{
	Uint8 r, g, b,a;
	int y0,u0,v0;
	int y1,u1,v1;
	int y2,u2,v2;
	int y,x;
	int height = src->h h ? src->h: dstrect->h;
	int width =  src->w w ? src->w: dstrect->w;
	int uv_off = 0;
	Uint32 pixel;

	printf ("src->format->BitsPerPixel %d src->format %08X\r\n",src->format->BitsPerPixel,src->format);

	if(dst->format != SDL_YV12_OVERLAY)return 1;

	for(y = 0; y format->BitsPerPixel)
			{
			case 8:
				pixel = *((Uint8*)src->pixels + y*src->pitch + x);
				break;
			case 16:
				pixel = *((Uint16*)src->pixels + y*src->pitch/2 + x);
				break;
			case 32:
				pixel = *((Uint32*)src->pixels + y*src->pitch/4 + x);

				break;
			default:
				return -1;
			}

			//SDL_GetRGB(pixel, src->format, &r, &g, &b);
			SDL_GetRGBA(pixel, src->format, &r, &g, &b,&a);

			rgb2yuv(r, g, b, &y1, &u1, &v1);

			if(isBlended)
			{
				y0 = (dst->pixels[0][ (dstrect->y + y) * dst->pitches[0] + (dstrect->x + x)]);
				v0 = (dst->pixels[1][ (uv_off + dstrect->y /2) * dst->pitches[1] + (dstrect->x/2 + x/2)]);
				u0 = (dst->pixels[2][ (uv_off + dstrect->y /2) * dst->pitches[2] + (dstrect->x/2 + x/2)]);

				y2 = (Uint8)(( y1 * a + y0 * ( 255 - a ) ) / 255);
				u2 = (Uint8)(( u1 * a + u0 * ( 255 - a ) ) / 255);
				v2 = (Uint8)(( v1 * a + v0 * ( 255 - a ) ) / 255);

				y1=y2;
				u1=u2;
				v1=v2;
			}

			memset(dst->pixels[0] + (dstrect->y + y) * dst->pitches[0] + (dstrect->x + x),
				(Uint8)y1  , 1);

			if((x%2 == 0 ) && (y%2 == 0 ))
			{
				memset(dst->pixels[1] + (uv_off + dstrect->y /2) * dst->pitches[1] + (dstrect->x/2 + x/2),
					(Uint8)v1, 1);
				memset(dst->pixels[2] + (uv_off + dstrect->y /2) * dst->pitches[2] + (dstrect->x/2 + x/2),
					(Uint8)u1, 1);
			}
		}
		if(y%2 == 0)++uv_off;
	}
	return 0;
}
时间: 2024-09-27 08:18:53

ARGB32 to YUV12 利用 SDL1.2 SDL_ttf 在视频表面输出文本的相关文章

利用FFmpeg玩转Android视频录制与压缩(二)<转>

转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女票已经分了又合,合了又分,本屌依旧骄傲单身.上一次啊我们大致说了一些简单的FFmpeg命令以及Java层简单的调用方式,然后有很多朋友在github或者csdn上给我留言,很多时候我都选择避而不答,原因是本库以前用的so包是不开源的,我根本改不了里面东西.但是这一次啊我们玩点大的,我重新编译了FFm

【Linux】利用Xvfb关闭chrome的图形化输出

利用Xvfb关闭chrome的图形化输出 #!/bin/bash . /home/fzuir/.profile # JAVA export JAVA_HOME=/usr/local/jdk1.7.0_75 export JRE_HOME=$JAVA_HOME/jre export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar # 利用Xvfb关闭chrome的图形化输出 X

利用FFMPEG简单分离音视频数据流

上一篇文章我们搭好了环境并编译出所需的ffmpeg库,本篇我们讨论如何利用ffmpeg提供的API函数进行多媒体文件的解封装(demux)过程.在讲解之前,我们需要了解一些基本的多媒体文件知识,大虾请飘过. 容器格式:不管是音频文件还是视频格式的文件,都是一个多媒体的容器,即container,比如常见的视频容器格式有avi.mp4.mkv.flv.rm/rmvb.mov.ts.vob.dat,音频容器格式有MP3.WAV.AAC.APE,FLAC等等,它容纳了视频.音频.字幕(subtitle

利用开源jPlayer播放.flv视频文件

最近工作中用到视频播放,在网上搜索对比了好几款开源播放插件后,觉得 jPlayer 是比较不错的,故作此记录! 接下来先快速的展示一下 利用jPlayer播放.flv视频的效果: 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="tex

DirectX11 With Windows SDK--16 利用几何着色器可选的流输出阶段帮助绘制多种分形

前言 在上一章,我们知道了如何使用几何着色器来重新组装图元,比如从一个三角形分裂成三个三角形.但是为了实现更高阶的分形,我们必须要从几何着色器拿到输出的顶点.这里我们可以使用可选的流输出阶段来拿到顶点集合. 注意: 本章末尾有大量的GIF动图! DirectX11 With Windows SDK完整目录 Github项目源码 流输出阶段 现在我们知道GPU可以写入纹理(textures),例如深度/模板缓冲区以及后备缓冲区.当然,我们也可以通过渲染管线的流输出阶段让GPU将几何着色器输出的顶点

Python爬虫——利用爬虫从网页获取视频资源

在某某花网上搜到一个视频,为了将视频下载到本地,我们尝试利用爬虫抓取资源 第一,我们检查网页元素,之后刷新页面 从上述信息中我们找到两个后缀名为.mp4的文件信息,其中第二条的status为206,留意它 点击这条信息,从中我们获取到了这条视频真正的URL 根据视频URL信息,参照之前爬取网页图片的方法,我们成功将视频文件保存至本地 (方法与其大同小异,只需将爬取代码中的URL链接进行更换即可) [传送门:https://www.cnblogs.com/fcbyoung/p/12291235.h

利用OpenCV存储一段视频中的每一帧

// vfc.cpp : 定义控制台应用程序的入口点.#include "stdafx.h"#include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h> #include <cv.h> int main(int argc, char *argv[]) { CvCapture* capture = cvCaptureFromAVI("11

利用HTML5来实现网页视频的定义

在上一代的html中我们通常使用JS或是flash动态显示视频.不过在全新的html5中这一功能已经完全能实现了.这无疑大大降低了我们服务器的压力.下面我们就来看一下这是如何实现的吧! <video>标签用于定义视频. 案例: <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8">     <title></ti

转:利用ffmpeg和opencv进行视频的解码播放

引子 OpenCV中有自己的用于处理图片和视频的类 VideoCapture ,可以很方便的读入文件和显示. 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象. ffmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库