mini_image_producer.cpp

00001
00002 /***************************************************************************
00003  *  mini_image.cpp - mini image producer
00004  *
00005  *  Generated: Tue May 17 09:21:41 2006 (Automatica 2006)
00006  *  Copyright  2005-2006  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version.
00014  *
00015  *  This program is distributed in the hope that it will be useful,
00016  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  *  GNU Library General Public License for more details.
00019  *
00020  *  Read the full text in the LICENSE.GPL file in the doc directory.
00021  */
00022
00023 #include <apps/fountain/mini_image_producer.h>
00024
00025 #include <utils/system/console_colors.h>
00026 #include <utils/logging/logger.h>
00027 #include <fvutils/scalers/scaler.h>
00028 #include <fvutils/ipc/shm_image.h>
00029 
00030 /** @class MiniImageProducer <apps/fountain/mini_image_producer.h>
00031  * Mini image producer.
00032  * Uses a scaler to create small version of an image.
00033  */
00034 
00035 /** Constructor.
00036  * @param orig_id original image ID
00037  * @param mini_id mini image ID
00038  * @param scaler Scaler
00039  * @param logger Logger
00040  */
00041 MiniImageProducer::MiniImageProducer(const char *orig_id, const char *mini_id,
00042                                      Scaler *scaler, Logger *logger)
00043 {
00044   scale_factor = 0.25;
00045
00046   this->scaler = scaler;
00047   scaler->set_scale_factor( scale_factor );
00048
00049   logger->log_debug("MiniImageProducer", "Opening original image shmem segment for id %s", orig_id);
00050   orig_shmem = new SharedMemoryImageBuffer( orig_id );
00051
00052   if ( ! orig_shmem->is_valid() ) {
00053     logger->log_error("MiniImageProducer", "Could not open original image");
00054     delete orig_shmem;
00055     orig_shmem = NULL;
00056     mini_shmem = NULL;
00057   } else {
00058
00059     scaler->set_original_dimensions( orig_shmem->width(), orig_shmem->height() );
00060
00061     logger->log_debug("MiniImageProducer", "Opening mini image shmem segment for id %s"
00062                                            ", w=%u, h=%u",
00063                       mini_id, scaler->needed_scaled_width(), scaler->needed_scaled_height());
00064
00065     mini_shmem = new SharedMemoryImageBuffer( mini_id, YUV422_PLANAR,
00066                                               scaler->needed_scaled_width(),
00067                                               scaler->needed_scaled_height() );
00068
00069     if ( ! mini_shmem->is_valid() ) {
00070       logger->log_error("MiniImageProducer", "Could not open mini image");
00071       delete orig_shmem;
00072       delete mini_shmem;
00073       orig_shmem = NULL;
00074       mini_shmem = NULL;
00075     }
00076   }
00077 }
00078
00079 
00080 /** Destructor. */
00081 MiniImageProducer::~MiniImageProducer()
00082 {
00083   delete orig_shmem;
00084   delete mini_shmem;
00085 }
00086
00087 
00088 /** Check if all data is valid.
00089  * @return true if shared memory images have been openened successfully and a scaler is
00090  * set, false otherwise
00091  */
00092 bool
00093 MiniImageProducer::isValid()
00094 {
00095   return ( (orig_shmem != NULL) &&
00096            (mini_shmem != NULL) &&
00097            (scaler != NULL) );
00098 }
00099
00100 
00101 /** Produce mini image. */
00102 void
00103 MiniImageProducer::produce()
00104 {
00105   if ( orig_shmem == NULL ) {
00106     logger->log_warn("MiniImageProducer", "Original shmem image not opened");
00107     return;
00108   }
00109   if ( mini_shmem == NULL ) {
00110     logger->log_warn("MiniImageProducer", "Mini shmem image not opened");
00111     return;
00112   }
00113
00114   scaler->set_scale_factor( scale_factor );
00115   scaler->set_original_dimensions( orig_shmem->width(), orig_shmem->height() );
00116   scaler->set_scaled_dimensions( mini_shmem->width(), mini_shmem->height() );
00117   scaler->set_original_buffer( orig_shmem->buffer() );
00118   scaler->set_scaled_buffer( mini_shmem->buffer() );
00119   scaler->scale();
00120 }
00121