diff options
author | deva <deva> | 2005-03-24 12:14:44 +0000 |
---|---|---|
committer | deva <deva> | 2005-03-24 12:14:44 +0000 |
commit | 9466b3042bc7314915a15f499bd0b087f569654d (patch) | |
tree | 29c41f6ba46b9b92d91b92578720e1beee44fc9d /src/img_encoder.cc | |
parent | b5a6a93dcc7a83f5c4f8fd1894e303ae58804e0b (diff) |
Initial revision
Diffstat (limited to 'src/img_encoder.cc')
-rw-r--r-- | src/img_encoder.cc | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/src/img_encoder.cc b/src/img_encoder.cc new file mode 100644 index 0000000..2f6d8b7 --- /dev/null +++ b/src/img_encoder.cc @@ -0,0 +1,161 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * RTVideoRec Realtime video recoder and encoder for Linux + * + * Copyright (C) 2004 Bent Bisballe + * Copyright (C) 2004 B. Stultiens + * Copyright (C) 2004 Koen Otter and Glenn van der Meyden + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "img_encoder.h" +#include <stdio.h> +//#include <setjmp.h> + +//av_alloc_format_context +//av_destruct_packet_nofree + +ImgEncoder::ImgEncoder() +{ + //////////////////// GLOBAL INIT + av_register_all(); + + //////////////////// DECODE INIT + AVCodec *deccodec; + + // find the dvvideo decoder + deccodec = avcodec_find_decoder(CODEC_ID_DVVIDEO); + if (!deccodec) { + fprintf(stderr, "codec not found\n"); + exit(1); + } + + dcc= avcodec_alloc_context(); + + // open it + if (avcodec_open(dcc, deccodec) < 0) { + fprintf(stderr, "could not open codec\n"); + exit(1); + } +} + +ImgEncoder::~ImgEncoder() +{ + // FIXME: free: deccodec and dcc +} + +void ImgEncoder::encode(DVFrame *dvframe, + char *filename, + int quality) +{ + int ret; + AVFrame *rawframe = avcodec_alloc_frame(); + + ///////////////////////// DECODE + uint8_t *ptr; + int got_picture = 1; + int len; + + ptr = (uint8_t *)dvframe->frame; + len = sizeof(dvframe->frame); + + ret = avcodec_decode_video(dcc, rawframe, &got_picture, ptr, len); + + if(!ret) { + printf("Decoder fuckup!\n"); + return; + } + + // TODO: Do image convertion here! + AVPicture pict; + avpicture_alloc(&pict,PIX_FMT_RGB24, 720, 576); + + img_convert(&pict, PIX_FMT_RGB24, (AVPicture *)rawframe, + PIX_FMT_YUV420P, 720, 576); + printf("converted\n"); + writeJPEGFile(filename, quality, (JSAMPLE*)(pict.data[0]), 720, 576); + printf("written\n"); + + avpicture_free(&pict); + av_free(rawframe); +} +/////////////////////////////////////////////////////////////////////////////////////////// + +void ImgEncoder::writeJPEGFile(char *filename, + int quality, + JSAMPLE * image_buffer, // Points to large array of R,G,B-order data + int image_width, // Number of columns in image + int image_height // Number of rows in image +) +{ + /* + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + + FILE * outfile; // target file + JSAMPROW row_pointer[1]; // pointer to JSAMPLE row[s] + int row_stride; // physical row width in image buffer + + // Step 1: allocate and initialize JPEG compression object + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + + // Step 2: specify data destination (eg, a file) + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + + // Step 3: set parameters for compression + cinfo.image_width = image_width; // image width and height, in pixels + cinfo.image_height = image_height; + cinfo.input_components = 3; // # of color components per pixel +/* +typedef enum { + JCS_UNKNOWN, // error/unspecified + JCS_GRAYSCALE, // monochrome + JCS_RGB, // red/green/blue + JCS_YCbCr, // Y/Cb/Cr (also known as YUV) + JCS_CMYK, // C/M/Y/K + JCS_YCCK // Y/Cb/Cr/K +} J_COLOR_SPACE; +* / + cinfo.in_color_space = JCS_RGB; // colorspace of input image + + jpeg_set_defaults(&cinfo); + + jpeg_set_quality(&cinfo, quality, TRUE); // limit to baseline-JPEG values + + // Step 4: Start compressor + jpeg_start_compress(&cinfo, TRUE); + + // Step 5: while (scan lines remain to be written) + row_stride = image_width * 3; // JSAMPLEs per row in image_buffer + + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + + // Step 6: Finish compression + jpeg_finish_compress(&cinfo); + fclose(outfile); + + // Step 7: release JPEG compression object + jpeg_destroy_compress(&cinfo); + */ +} |