/** \fn PreviewGenerator::GetScreenGrab(const ProgramInfo*, const QString&, long long, bool, int&, int&, int&, float&) * \brief Returns a PIX_FMT_RGBA32 buffer containg a frame from the video. * * \param pginfo Recording to grab from. * \param filename File containing recording. * \param seektime Seconds or frames into the video to seek before * capturing a frame. * \param time_in_secs if true time is in seconds, otherwise it is in frames. * \param bufferlen Returns size of buffer returned (in bytes). * \param video_width Returns width of frame grabbed. * \param video_height Returns height of frame grabbed. * \param video_aspect Returns aspect ratio of frame grabbed. * \return Buffer allocated with new containing frame in RGBA32 format if * successful, NULL otherwise. */ char *PreviewGenerator::GetScreenGrab( const ProgramInfo *pginfo, const QString &filename, long long seektime, bool time_in_secs, int &bufferlen, int &video_width, int &video_height, float &video_aspect) { (void) pginfo; (void) filename; (void) seektime; (void) time_in_secs; (void) bufferlen; (void) video_width; (void) video_height; char *retbuf = NULL; bufferlen = 0; #ifdef USING_FRONTEND if (!MSqlQuery::testDBConnection()) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Previewer could not connect to DB."); return NULL; } // pre-test local files for existence and size. 500 ms speed-up... if (filename.left(1)=="/") { QFileInfo info(filename); bool invalid = !info.exists() || !info.isReadable() || !info.isFile(); if (!invalid) { // Check size too, QFileInfo can not handle large files unsigned long long fsize = myth_get_approximate_large_file_size(filename); invalid = (fsize < 8*1024); } if (invalid) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Previewer file " + QString("'%1'").arg(filename) + " is not valid."); return NULL; } } RingBuffer *rbuf = new RingBuffer(filename, false, false, 0); if (!rbuf->IsOpen()) { VERBOSE(VB_IMPORTANT, LOC_ERR + "Previewer could not open file: " + QString("'%1'").arg(filename)); delete rbuf; return NULL; } NuppelVideoPlayer *nvp = new NuppelVideoPlayer(kInUseID, pginfo); nvp->SetRingBuffer(rbuf); if (time_in_secs) retbuf = nvp->GetScreenGrab(seektime, bufferlen, video_width, video_height, video_aspect); else retbuf = nvp->GetScreenGrabAtFrame( seektime, true, bufferlen, video_width, video_height, video_aspect); delete nvp; delete rbuf; #else // USING_FRONTEND QString msg = "Backend compiled without USING_FRONTEND !!!!"; VERBOSE(VB_IMPORTANT, LOC_ERR + msg); #endif // USING_FRONTEND if (retbuf) { VERBOSE(VB_GENERAL, LOC + QString("Grabbed preview '%0' %1x%2@%3%4") .arg(filename).arg(video_width).arg(video_height) .arg((Q_LLONG)seektime).arg((time_in_secs) ? "s" : "f")); } return retbuf; }
/** * \brief Returns a PIX_FMT_RGBA32 buffer containg a frame from the video. * * \param pginfo Recording to grab from. * \param filename File containing recording. * \param seektime Seconds or frames into the video to seek before * capturing a frame. * \param time_in_secs if true time is in seconds, otherwise it is in frames. * \param bufferlen Returns size of buffer returned (in bytes). * \param video_width Returns width of frame grabbed. * \param video_height Returns height of frame grabbed. * \param video_aspect Returns aspect ratio of frame grabbed. * \return Buffer allocated with new containing frame in RGBA32 format if * successful, NULL otherwise. */ char *PreviewGenerator::GetScreenGrab( const ProgramInfo &pginfo, const QString &filename, long long seektime, bool time_in_secs, int &bufferlen, int &video_width, int &video_height, float &video_aspect) { (void) pginfo; (void) filename; (void) seektime; (void) time_in_secs; (void) bufferlen; (void) video_width; (void) video_height; char *retbuf = NULL; bufferlen = 0; if (!MSqlQuery::testDBConnection()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Previewer could not connect to DB."); return NULL; } // pre-test local files for existence and size. 500 ms speed-up... if (filename.left(1)=="/") { QFileInfo info(filename); bool invalid = (!info.exists() || !info.isReadable() || (info.isFile() && (info.size() < 8*1024))); if (invalid) { LOG(VB_GENERAL, LOG_ERR, LOC + "Previewer file " + QString("'%1'").arg(filename) + " is not valid."); return NULL; } } RingBuffer *rbuf = RingBuffer::Create(filename, false, false, 0); if (!rbuf->IsOpen()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Previewer could not open file: " + QString("'%1'").arg(filename)); delete rbuf; return NULL; } PlayerContext *ctx = new PlayerContext(kPreviewGeneratorInUseID); ctx->SetRingBuffer(rbuf); ctx->SetPlayingInfo(&pginfo); ctx->SetPlayer(new MythPlayer()); ctx->player->SetPlayerInfo(NULL, NULL, true, ctx); if (time_in_secs) retbuf = ctx->player->GetScreenGrab(seektime, bufferlen, video_width, video_height, video_aspect); else retbuf = ctx->player->GetScreenGrabAtFrame( seektime, true, bufferlen, video_width, video_height, video_aspect); delete ctx; if (retbuf) { LOG(VB_GENERAL, LOG_INFO, LOC + QString("Grabbed preview '%0' %1x%2@%3%4") .arg(filename).arg(video_width).arg(video_height) .arg(seektime).arg((time_in_secs) ? "s" : "f")); } return retbuf; }