summaryrefslogtreecommitdiff
path: root/src/img_encoder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/img_encoder.cc')
-rw-r--r--src/img_encoder.cc161
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);
+ */
+}