利用三星S3C6410源碼實現同時壓縮視頻和圖片,s3c6410源碼

來源:互聯網
上載者:User

利用三星S3C6410源碼實現同時壓縮視頻和圖片,s3c6410源碼

前段時間實現了利用三星S3C6410一邊壓縮視頻產生H264檔案一邊抓取並壓縮產生jpg圖片。核心步驟如下:

    /* 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轉平面YUV422static 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");

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.