当前位置:编程学习 > 网站相关 >>

把YUYV转化为jpg格式(改进v4l2的应用程序编写)

1.要用jpeg库编译,所以要先编译jpegsrc.v6b.tar.gz,
$ cd jpeg-6b
 $ ./configure --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux
 $ make
 $ make install
2.然后编译video2_jpeg.c
>arm-linux-gcc -o video2_jpeg video2_jpeg.c -I/work/tools/gcc -I/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include -L//work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib -ljpeg
源码video2_jpeg.c如下:
#include <stdio.h>
 
#include <stdlib.h>
 
#include <string.h>
 
#include <assert.h>
 
#include <getopt.h> 
 
#include <fcntl.h>
 
#include <unistd.h>
 
#include <errno.h>
 
#include <malloc.h>
 
#include <sys/stat.h>
 
#include <sys/types.h>
 
#include <sys/time.h>
 
#include <sys/mman.h>
 
#include <sys/ioctl.h>
 
#include <asm/types.h>
 
#include <linux/videodev2.h>
 
#include <jpeglib.h>
 
 
 
#define OUTPUT_BUF_SIZE 4096
 
#define CLEAR(x) memset(&(x), 0, sizeof(x))
 
#define WIDTH 320
 
#define HEIGHT 240
 
 
 
struct buffer {
 
 void *start;
 
 size_t length;
 
};
 
 
 
typedef struct {
 
struct jpeg_destination_mgr pub;
 
 
 
JOCTET * buffer; 
 
 
 
unsigned char *outbuffer;
 
int outbuffer_size;
 
unsigned char *outbuffer_cursor;
 
int *written;
 
 
 
}mjpg_destination_mgr;
 
 
 
typedef mjpg_destination_mgr *mjpg_dest_ptr;
 
 
 
static char * dev_name= "/dev/video0";
 
static int fd= -1;
struct buffer * buffers = NULL;
static unsigned int n_buffers = 0;
FILE *file_fd;
 
static unsigned long file_length;
 
static unsigned char *file_name;
 
 
 
METHODDEF(void) init_destination(j_compress_ptr cinfo) {
 
mjpg_dest_ptr dest =(mjpg_dest_ptr) cinfo->dest;
 
dest->buffer =(JOCTET *)(*cinfo->mem->alloc_small)((j_common_ptr) cinfo, JPOOL_IMAGE, OUTPUT_BUF_SIZE*sizeof(JOCTET));
 
*(dest->written) = 0;
 
dest->pub.next_output_byte = dest->buffer;
 
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
 
}
 
 
 
METHODDEF(boolean) empty_output_buffer(j_compress_ptr cinfo) {
 
mjpg_dest_ptr dest =(mjpg_dest_ptr) cinfo->dest;
 
memcpy(dest->outbuffer_cursor, dest->buffer, OUTPUT_BUF_SIZE);
 
dest->outbuffer_cursor += OUTPUT_BUF_SIZE;
 
*(dest->written) += OUTPUT_BUF_SIZE;
 
dest->pub.next_output_byte = dest->buffer;
 
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
 
 
 
return TRUE;
 
}
 
 
 
METHODDEF(void) term_destination(j_compress_ptr cinfo) {
 
mjpg_dest_ptr dest =(mjpg_dest_ptr) cinfo->dest;
 
size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer;
 
/* Write any data remaining in the buffer */
 
memcpy(dest->outbuffer_cursor, dest->buffer, datacount);
 
dest->outbuffer_cursor += datacount;
 
*(dest->written) += datacount;
 
}
 
 
 
void dest_buffer(j_compress_ptr cinfo, unsigned char *buffer, int size, int *written) {
 
mjpg_dest_ptr dest;
 
if(cinfo->dest == NULL) {
 
cinfo->dest =(struct jpeg_destination_mgr *)(*cinfo->mem->alloc_small)((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(mjpg_destination_mgr));
 
}
 
 
 
dest =(mjpg_dest_ptr)cinfo->dest;
 
dest->pub.init_destination = init_destination;
 
dest->pub.empty_output_buffer = empty_output_buffer;
 
dest->pub.term_destination = term_destination;
 
dest->outbuffer = buffer;
 
dest->outbuffer_size = size;
 
dest->outbuffer_cursor = buffer;
 
dest->written = written;
 
}
 
 
 
//......YUYV.....JPEG..
 
int compress_yuyv_to_jpeg(unsigned char *buf, unsigned char *buffer, int size, int quality) {
 
struct jpeg_compress_struct cinfo;
 
struct jpeg_error_mgr jerr;
 
JSAMPROW row_pointer[1];
 
unsigned char *line_buffer, *yuyv;
 
int z;
 
static int written;
 
//int count = 0;
 
//printf("%s\n", buf);
 
line_buffer = calloc(WIDTH * 3, 1);
 
yuyv = buf;
printf("compress start...\n");
 
cinfo.err = jpeg_std_error(&jerr);
 
jpeg_create_compress(&cinfo);
 
/* jpeg_stdio_dest(&cinfo, file); */
 
dest_buffer(&cinfo, buffer, size, &written);
 
 
 
cinfo.image_width = WIDTH;
 
cinfo.image_height = HEIGHT;
 
cinfo.input_components = 3;
 
cinfo.in_color_space = JCS_RGB;
 
 
 
jpeg_set_defaults(&cinfo);
 
jpeg_set_quality(&cinfo, quality, TRUE);
 
jpeg_start_compress(&cinfo, TRUE);
 
 
 
z = 0;
 
while(cinfo.next_scanline < HEIGHT) {
 
int x;
 
unsigned char *ptr = line_buffer;
 
 
 
for(x = 0; x < WIDTH; x++) {
 
int r, g, b;
 
int
补充:Web开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,