diff options
Diffstat (limited to 'src/img_encoder.cc')
-rw-r--r-- | src/img_encoder.cc | 196 |
1 files changed, 0 insertions, 196 deletions
diff --git a/src/img_encoder.cc b/src/img_encoder.cc deleted file mode 100644 index 9282dc0..0000000 --- a/src/img_encoder.cc +++ /dev/null @@ -1,196 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * img_encoder.cc - * - * Mon Nov 15 19:45:07 CET 2004 - * Copyright 2004 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 B. Stultiens - * Copyright (C) 2004 Koen Otter and Glenn van der Meyden - */ - -/* - * This file is part of MIaV. - * - * MIaV 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. - * - * MIaV 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 MIaV; 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 "debug.h" - -extern "C" { -#include <jpeglib.h> -} - -#include "jpeg_mem_dest.h" - -// Use libdv -#include <libdv/dv.h> -#include <libdv/dv_types.h> - -ImgEncoder::ImgEncoder(const char* cpr, Info *i) -{ - info = i; - - // Create path and filename - char fname[256]; - string *server_root; - char birthmonth[3]; - char date[32]; - char encrypted_cpr[32]; - - // Get server root - server_root = config->readString("server_image_root"); - - // Copy the bytes representing the birth month from the cpr - // [dd][mm][yy]-[nn][nn] - strncpy(birthmonth, &cpr[2], 2); - birthmonth[2] = 0; - - // Create date (today) in [yyyy][mm][dd] - struct tm *ltime; - time_t t = time(NULL); - ltime = localtime(&t); - sprintf(date, "%.4d%.2d%.2d", - ltime->tm_year + 1900, - ltime->tm_mon, - ltime->tm_mday); - - // Create 'encrypted' cpr, reverse numbers, skip month, and subtract from 9 - // [d1][d2][m1][m2][y1][y2]-[n1][n2][n3][n4] - // => - // [9-n4][9-n3][9-n2][9-n1][9-y2][9-y1][9-d2][9-d1] - memset(encrypted_cpr, 0, sizeof(encrypted_cpr)); - int p = strlen(cpr) - 1; - int cnt = 0; - while(p) { - encrypted_cpr[cnt] = cpr[p]; - p--; - if(p == 2) p--; - if(cpr[p] == '-' || p == 3) p--; - cnt++; - } - - sprintf(fname, "%s/%s/%s/%s-%s-", server_root->c_str(), birthmonth, encrypted_cpr, cpr, date); - - file = new File(fname, "jpg", info); -} - - -ImgEncoder::~ImgEncoder() -{ - delete file; -} - - -void ImgEncoder::encode(Frame *dvframe, int quality) -{ - unsigned char rgb[720*576*4]; - - getRGB(dvframe, rgb); - writeJPEGFile(quality, rgb, 720, 576); -} - - -void ImgEncoder::writeJPEGFile(int quality, unsigned char *rgb, int image_width, int image_height) -{ - JSAMPLE *image_buffer = (JSAMPLE*)rgb; - - size_t buffersize = (image_width * image_height * 3) + JPEG_HEADER_PAD; - char *jpeg_output_buffer = new char [buffersize]; - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; - - JSAMPROW row_pointer[1]; // pointer to JSAMPLE row[s] - int row_stride; // physical row width in image buffer - - // Allocate and initialize JPEG compression object - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_compress(&cinfo); - - // Specify data destination (see jpeg_mem_dest) - jpeg_mem_dest(&cinfo, jpeg_output_buffer, &buffersize); - - // Set compression parameters - 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 - 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 - - // Start compressor - jpeg_start_compress(&cinfo, TRUE); - - // 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); - } - - // Finish compression - jpeg_finish_compress(&cinfo); - - // Release JPEG compression object - jpeg_destroy_compress(&cinfo); - - info->info("JPEG buffersize: %d", buffersize); - file->Write(jpeg_output_buffer, buffersize); - delete jpeg_output_buffer; -} - -void ImgEncoder::getRGB(Frame *frame, unsigned char *rgb) -{ - unsigned char *pixels[3]; - int pitches[3]; - - pixels[ 0 ] = rgb; - pixels[ 1 ] = NULL; - pixels[ 2 ] = NULL; - - pitches[ 0 ] = 720 * 3; - pitches[ 1 ] = 0; - pitches[ 2 ] = 0; - - dv_decoder_t *decoder = dv_decoder_new(FALSE/*this value is unused*/, FALSE, FALSE); - decoder->quality = DV_QUALITY_BEST; - - dv_parse_header(decoder, frame->data); - - decoder->system = e_dv_system_625_50; // PAL lines, PAL framerate - decoder->sampling = e_dv_sample_422; // 4 bytes y, 2 bytes u, 2 bytes v - decoder->std = e_dv_std_iec_61834; - decoder->num_dif_seqs = 12; - - // libdv img decode to rgb - dv_decode_full_frame(decoder, - frame->data, - e_dv_color_rgb, - pixels, - pitches); - - dv_decoder_free(decoder); -} |