利用三星S3C6410源码实现同时压缩视频和图片

前段时间实现了利用三星S3C6410一边压缩视频生成H264文件一边抓取并压缩生成jpg图片。核心步骤如下:

  1. 视频压缩和图片压缩利用同一个handle。
    /* Codec set */
    /* Get capability */
    ret = ioctl(cam_c_fp , VIDIOC_QUERYCAP, &cap);

一边压缩视频:

if(frame_count == 1)
                    encoded_buf = mfc_encoder_exe(handle, g_yuv, YUV_FRAME_BUFFER_SIZE, 1, &encoded_size);
                else
                    encoded_buf = mfc_encoder_exe(handle, g_yuv, YUV_FRAME_BUFFER_SIZE, 0, &encoded_size);

2.一边获取视频中的某一帧的数据:

 if (read(cam_c_fp, g_yuv_cc, g_YUV420_Frame_Buffer_Size) < 0) {
        perror("read()");}

3.读取完数据之后,因为图片压缩前的格式必须是yuv422的,而摄像头的数据格式为yuv420所以需要转化:

convert_yuv420p_to_yuv422_my( g_yuv_cc,g_yuv_c,g_codec_Width,g_codec_Height);

转化的具体实现为:

//平面YUV420转平面YUV422
static void convert_yuv420p_to_yuv422_my(unsigned char *src,unsigned char *dst,int width,int height)
{
int i,j;
unsigned char *pY420_0=src;
unsigned char *pY420_1=src+width;
unsigned char *pU420=src+width*height;
unsigned char *pV420=src+width*height*5/4;
unsigned char *pY422_0=dst;
unsigned char *pY422_1=dst+width*2;

for(i=0;i<height/2;i++)
{
for(j=0;j<width*2;j+=4)
{
*pY422_0++=*pY420_0++;
*pY422_1++=*pY420_1++;
*pY422_0++=*pU420;
*pY422_1++=*pU420++;

*pY422_0++=*pY420_0++;
*pY422_1++=*pY420_1++;
*pY422_0++=*pV420;
*pY422_1++=*pV420++;

}

pY420_0+=width;
pY420_1+=width;
pY422_0+=width*2;
pY422_1+=width*2;
}
}

4.转换完成之后就是简单的压缩过程了:

/* JPEG encoding */
    /* JPEG Handle initialization */
    jpg_handle = SsbSipJPEGEncodeInit();
    if (jpg_handle < 0)
        return;

    /* Set encoding configs */
    if((ret = SsbSipJPEGSetConfig(JPEG_SET_SAMPING_MODE, JPG_422)) != JPEG_OK)
        return;

        if((ret = SsbSipJPEGSetConfig(JPEG_SET_ENCODE_WIDTH, g_codec_Width)) != JPEG_OK)
        return;

        if((ret = SsbSipJPEGSetConfig(JPEG_SET_ENCODE_HEIGHT, g_codec_Height)) != JPEG_OK)
        return;

    if((ret = SsbSipJPEGSetConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_2)) != JPEG_OK)
        return;

    if((ret = SsbSipJPEGSetConfig(JPEG_SET_ENCODE_THUMBNAIL, TRUE)) != JPEG_OK)
        return;

        //if((ret = SsbSipJPEGSetConfig(JPEG_SET_THUMBNAIL_WIDTH, 160)) != JPEG_OK)
        //  return;

        //   Main JPEG have to be multiple of Thumbnail resolution
        if((ret = SsbSipJPEGSetConfig(JPEG_SET_THUMBNAIL_WIDTH, g_Thumbnail_Width)) != JPEG_OK)
                return;

        //if((ret = SsbSipJPEGSetConfig(JPEG_SET_THUMBNAIL_HEIGHT, 120)) != JPEG_OK)
                //return;

       //   Main JPEG have to be multiple of Thumbnail resolution
        if((ret = SsbSipJPEGSetConfig(JPEG_SET_THUMBNAIL_HEIGHT, g_Thumbnail_Height)) != JPEG_OK)
                return;

    /* Get input buffer address */
        in_buf = SsbSipJPEGGetEncodeInBuf(jpg_handle, g_YUV422_Frame_Buffer_Size);
    if(in_buf == NULL)
        return;

    /* Copy YUV data from camera to JPEG driver */
        memcpy(in_buf, g_yuv_c, g_YUV422_Frame_Buffer_Size);

    /* Make Exif info parameters */
    memset(&ExifInfo, 0x00, sizeof(ExifFileInfo));
    makeExifParam(&ExifInfo);

    /* Encode YUV stream */
    ret = SsbSipJPEGEncodeExe(jpg_handle, &ExifInfo, JPEG_USE_HW_SCALER);    //with Exif

    /* Get output buffer address */
    out_buf = SsbSipJPEGGetEncodeOutBuf(jpg_handle, &jpg_size);
    if(out_buf == NULL)
        return;

    fwrite(out_buf, 1, jpg_size, jpg_fp);

    fclose(jpg_fp);
    SsbSipJPEGEncodeDeInit(jpg_handle);

    printf("CAPTURE SUCCESS\n");
时间: 2024-11-02 10:38:48

利用三星S3C6410源码实现同时压缩视频和图片的相关文章

linux内存源码分析 - 内存压缩(同步关系)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也那么复杂吧,带着好奇心就把页面迁移的源码都大致看了一遍,还好,不复杂,也容易理解,这里我们就说说在页面迁移过程中是如何进行同步的.不过首先可能没看过的朋友需要先看看linux内存源码分析 - 内存压缩(一),因为会涉及里面的一些知识. 其实一句话可以概括页面迁移时是如何进行同步的,就是:我要开始对这

利用ServerlessPC蛋蛋源码下载,让COS中文件变更自动刷新CDN

第二种是使用字段判断逻辑PC蛋蛋源码下载联系方式:QQ:2747044651 网址http://zhengtuwl.com .也就是服务器进程,会在每次读取缓存前,根据一些特征数据,快速的判断内存中的缓存和源数据内容,是否有不一致(是否脏)的地方,如果有不一致的地方,就自动清理这条数据的缓存.这种做法会消耗一部分CPU,但是就不需要人工去处理清理缓存的事情,自动化程度很高.现在我们的浏览器和WEB服务器之间,就有用这种机制:检查文件MD5:或者检查文件最后更新时间.具体的做法,就是每次浏览器发起

Android应用源码可以按音乐视频图片分类浏览的安卓文件浏览器

本项目是一个可按音乐.图片.视频分类浏览的安卓文件浏览器.具有多选.打开.复制.粘贴.删除.重命名.查看属性等功能,并且还可以切换列表显示效果和对文件分类浏览,比较遗憾的是源码注释不多,项目编码UTF-8编译版本2.3.3.MediaCenter是程序的主项目依赖moduleAboutus和moduleAnimtab两个项目,三个项目如果导入以后没有自动添加引用关系需要手动在Library里面添加引用关系. 代码截图: 运行效果截图: 源码包免费下载地址:[点击这里]

WebRTC源码分析三:视频处理流程

转自:http://blog.csdn.net/neustar1/article/details/19480863 文本介绍视频的处理流程.图1中显示了两路视频会话视频信号流过程. 图1 视频流程示意图 以一路视频会话为例,主要分为以下几个线程: 1)视频源产生线程:Camera生产视频画面,封装成视频帧,以一定帧率投递到下一个模块.: 2)采集线程:由Capturer负责采集视频帧,并对视频帧进行一定处理,如调整画面亮度.并送入各个发送链路的编码模块编码并发送出去: 3)接收线程:Rtp/Rt

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

JAVA上百实例源码以及开源项目

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

微信小程序源码下载(200多个)

微信小程序源码下载汇总,点击标题进入对应的微信小程序下载页面. 最新 demo源码(点击标题进入帖子下载) 描述 1 微信小程序 会议室预定小程序 微信小程序 会议室预定小程序**** 本内容被作者隐藏 **** 2 微信小程序-双人五子棋小游戏 微信小程序-双人五子棋小游戏**** 本内容被作者隐藏 **** 3 打卡签到小程序 用微信小程序实现的一个简单的打卡签到的小程序拒绝 4 微信小程序---左滑删除 微信小程序---左滑删除**** 本内容被作者隐藏 **** 5 一个借钱的记事本的微

九款酷炫基于jquery实现的应用及源码

1.HTML5 Loading动画加载 五彩的圆环Loading 今天我们要分享一款基于HTML5的Loading加载动画特效,这款HTML5加载动画是一个五彩的圆环,圆环不停地转动从而体现加载正在进行.如果你感兴趣,可以查看这款HTML5 Loading动画的在线演示,效果还不错. 在线演示 源码下载 2.jQuery产品图片横向滚动 自定义滚动条 这是一款很棒的jQuery图片滚动插件,这款jQuery插件有以下特点:可以设置任意数量的图片,并且点击图片即可将当前图片激活放大.也可以点击左右

jQuery实例—选项卡(js源码和jQuery)

分别利用javascript的源码和jQuery来实现一个简单的选项卡,对比各自的步骤. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> &l