/* -*- 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 //#include //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); */ }