00001
00002 #include <sys/time.h>
00003
00004
00005 #include <QSize>
00006
00007
00008 #include "mythlogging.h"
00009 #include "mythplayer.h"
00010 #include "frame.h"
00011
00012
00013 #include "CommDetector2.h"
00014 #include "pgm.h"
00015 #include "PGMConverter.h"
00016
00017 using namespace commDetector2;
00018
00019 PGMConverter::PGMConverter(void)
00020 : frameno(-1)
00021 , width(-1)
00022 , height(-1)
00023 #ifdef PGM_CONVERT_GREYSCALE
00024 , time_reported(false)
00025 #endif
00026 {
00027 memset(&pgm, 0, sizeof(pgm));
00028 memset(&convert_time, 0, sizeof(convert_time));
00029 }
00030
00031 PGMConverter::~PGMConverter(void)
00032 {
00033 width = -1;
00034 #ifdef PGM_CONVERT_GREYSCALE
00035 avpicture_free(&pgm);
00036 memset(&pgm, 0, sizeof(pgm));
00037 #endif
00038 }
00039
00040 int
00041 PGMConverter::MythPlayerInited(const MythPlayer *player)
00042 {
00043 #ifdef PGM_CONVERT_GREYSCALE
00044 time_reported = false;
00045 memset(&convert_time, 0, sizeof(convert_time));
00046 #endif
00047
00048 if (width != -1)
00049 return 0;
00050
00051 QSize buf_dim = player->GetVideoBufferSize();
00052 width = buf_dim.width();
00053 height = buf_dim.height();
00054
00055 #ifdef PGM_CONVERT_GREYSCALE
00056 if (avpicture_alloc(&pgm, PIX_FMT_GRAY8, width, height))
00057 {
00058 LOG(VB_COMMFLAG, LOG_ERR, QString("PGMConverter::MythPlayerInited "
00059 "avpicture_alloc pgm (%1x%2) failed")
00060 .arg(width).arg(height));
00061 return -1;
00062 }
00063 LOG(VB_COMMFLAG, LOG_INFO, QString("PGMConverter::MythPlayerInited "
00064 "using true greyscale conversion"));
00065 #else
00066 LOG(VB_COMMFLAG, LOG_INFO, QString("PGMConverter::MythPlayerInited "
00067 "(YUV shortcut)"));
00068 #endif
00069
00070 return 0;
00071 }
00072
00073 const AVPicture *
00074 PGMConverter::getImage(const VideoFrame *frame, long long _frameno,
00075 int *pwidth, int *pheight)
00076 {
00077 #ifdef PGM_CONVERT_GREYSCALE
00078 struct timeval start, end, elapsed;
00079 #endif
00080
00081 if (frameno == _frameno)
00082 goto out;
00083
00084 if (!frame->buf)
00085 {
00086 LOG(VB_COMMFLAG, LOG_ERR, "PGMConverter::getImage no buf");
00087 goto error;
00088 }
00089
00090 #ifdef PGM_CONVERT_GREYSCALE
00091 (void)gettimeofday(&start, NULL);
00092 if (pgm_fill(&pgm, frame))
00093 goto error;
00094 (void)gettimeofday(&end, NULL);
00095 timersub(&end, &start, &elapsed);
00096 timeradd(&convert_time, &elapsed, &convert_time);
00097 #else
00098 if (avpicture_fill(&pgm, frame->buf, PIX_FMT_GRAY8, width, height) == -1)
00099 {
00100 LOG(VB_COMMFLAG, LOG_ERR,
00101 QString("PGMConverter::getImage error at frame %1 (%2x%3)")
00102 .arg(_frameno).arg(width).arg(height));
00103 goto error;
00104 }
00105 #endif
00106
00107 frameno = _frameno;
00108
00109 out:
00110 *pwidth = width;
00111 *pheight = height;
00112 return &pgm;
00113
00114 error:
00115 return NULL;
00116 }
00117
00118 int
00119 PGMConverter::reportTime(void)
00120 {
00121 #ifdef PGM_CONVERT_GREYSCALE
00122 if (!time_reported)
00123 {
00124 LOG(VB_COMMFLAG, LOG_INFO, QString("PGM Time: convert=%1s")
00125 .arg(strftimeval(&convert_time)));
00126 time_reported = true;
00127 }
00128 #endif
00129 return 0;
00130 }
00131
00132