本文整理汇总了C++中VideoOutput::GetLastShownFrame方法的典型用法代码示例。如果您正苦于以下问题:C++ VideoOutput::GetLastShownFrame方法的具体用法?C++ VideoOutput::GetLastShownFrame怎么用?C++ VideoOutput::GetLastShownFrame使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VideoOutput
的用法示例。
在下文中一共展示了VideoOutput::GetLastShownFrame方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DisplayRawTextSubtitles
void SubtitleScreen::DisplayRawTextSubtitles(void)
{
if (!InitialiseFont(m_fontStretch) || !m_player || !m_subreader)
return;
uint64_t duration;
QStringList subs = m_subreader->GetRawTextSubtitles(duration);
if (subs.empty())
return;
VideoOutput *vo = m_player->GetVideoOutput();
if (vo)
{
QRect oldsafe = m_safeArea;
m_safeArea = m_player->GetVideoOutput()->GetSafeRect();
if (oldsafe != m_safeArea)
{
int height = (m_safeArea.height() * m_textFontZoom) / 1800;
gTextSubFont->GetFace()->setPixelSize(height);
gTextSubFont->SetColor(Qt::white);
}
}
else
return;
VideoFrame *currentFrame = vo->GetLastShownFrame();
if (!currentFrame)
return;
// delete old subs that may still be on screen
DeleteAllChildren();
OptimiseTextSubs(subs);
DrawTextSubtitles(subs, currentFrame->timecode, duration);
}
示例2: ExpireSubtitles
void SubtitleScreen::ExpireSubtitles(void)
{
VideoOutput *videoOut = m_player->GetVideoOutput();
VideoFrame *currentFrame = videoOut ? videoOut->GetLastShownFrame() : NULL;
long long now = currentFrame ? currentFrame->timecode : LLONG_MAX;
QMutableHashIterator<MythUIType*, long long> it(m_expireTimes);
while (it.hasNext())
{
it.next();
if (it.value() < now)
{
DeleteChild(it.key());
it.remove();
SetRedraw();
}
}
}
示例3: Test
void Test(void)
{
PIPMap dummy;
if (novideosync) // TODO
LOG(VB_GENERAL, LOG_INFO, "Will attempt to disable sync-to-vblank.");
RingBuffer *rb = RingBuffer::Create(file, false, true, 2000);
MythPlayer *mp = new MythPlayer(kAudioMuted);
mp->GetAudio()->SetAudioInfo("NULL", "NULL", 0, 0);
mp->GetAudio()->SetNoAudio();
ctx = new PlayerContext("VideoPerformanceTest");
ctx->SetRingBuffer(rb);
ctx->SetPlayer(mp);
ctx->SetPlayingInfo(new ProgramInfo(file));
mp->SetPlayerInfo(NULL, GetMythMainWindow(), true, ctx);
FrameScanType scan = deinterlace ? kScan_Interlaced : kScan_Progressive;
if (!mp->StartPlaying())
{
LOG(VB_GENERAL, LOG_ERR, "Failed to start playback.");
return;
}
VideoOutput *vo = mp->GetVideoOutput();
if (!vo)
{
LOG(VB_GENERAL, LOG_ERR, "No video output.");
return;
}
LOG(VB_GENERAL, LOG_INFO, "-----------------------------------");
LOG(VB_GENERAL, LOG_INFO, QString("Starting video performance test for '%1'.")
.arg(file));
LOG(VB_GENERAL, LOG_INFO, QString("Test will run for %1 seconds.")
.arg(secondstorun));
if (decodeonly)
LOG(VB_GENERAL, LOG_INFO, "Decoding frames only - skipping display.");
LOG(VB_GENERAL, LOG_INFO, QString("Deinterlacing %1")
.arg(deinterlace ? "enabled" : "disabled"));
Jitterometer *jitter = new Jitterometer("Performance: ", mp->GetFrameRate());
int ms = secondstorun * 1000;
QTime start = QTime::currentTime();
while (1)
{
int duration = start.msecsTo(QTime::currentTime());
if (duration < 0 || duration > ms)
{
LOG(VB_GENERAL, LOG_INFO, "Complete.");
break;
}
if (mp->IsErrored())
{
LOG(VB_GENERAL, LOG_ERR, "Playback error.");
break;
}
if (mp->GetEof())
{
LOG(VB_GENERAL, LOG_INFO, "End of file.");
break;
}
if (!mp->PrebufferEnoughFrames())
continue;
mp->SetBuffering(false);
vo->StartDisplayingFrame();
VideoFrame *frame = vo->GetLastShownFrame();
mp->CheckAspectRatio(frame);
if (!decodeonly)
{
vo->ProcessFrame(frame, NULL, NULL, dummy, scan);
vo->PrepareFrame(frame, scan, NULL);
vo->Show(scan);
}
vo->DoneDisplayingFrame(frame);
jitter->RecordCycleTime();
}
LOG(VB_GENERAL, LOG_INFO, "-----------------------------------");
}
示例4: DisplayTextSubtitles
void SubtitleScreen::DisplayTextSubtitles(void)
{
if (!InitialiseFont(m_fontStretch) || !m_player || !m_subreader)
return;
bool changed = false;
VideoOutput *vo = m_player->GetVideoOutput();
if (vo)
{
QRect oldsafe = m_safeArea;
m_safeArea = m_player->GetVideoOutput()->GetSafeRect();
if (oldsafe != m_safeArea)
{
changed = true;
int height = (m_safeArea.height() * m_textFontZoom) / 2000;
gTextSubFont->GetFace()->setPixelSize(height);
gTextSubFont->GetFace()->setItalic(false);
gTextSubFont->GetFace()->setUnderline(false);
gTextSubFont->SetColor(Qt::white);
}
}
else
{
return;
}
VideoFrame *currentFrame = vo->GetLastShownFrame();
if (!currentFrame)
return;
TextSubtitles *subs = m_subreader->GetTextSubtitles();
subs->Lock();
uint64_t playPos = 0;
if (subs->IsFrameBasedTiming())
{
// frame based subtitles get out of synch after running mythcommflag
// for the file, i.e., the following number is wrong and does not
// match the subtitle frame numbers:
playPos = currentFrame->frameNumber;
}
else
{
// Use timecodes for time based SRT subtitles. Feeding this into
// NormalizeVideoTimecode() should adjust for non-zero start times
// and wraps. For MPEG, wraps will occur just once every 26.5 hours
// and other formats less frequently so this should be sufficient.
// Note: timecodes should now always be valid even in the case
// when a frame doesn't have a valid timestamp. If an exception is
// found where this is not true then we need to use the frameNumber
// when timecode is not defined by uncommenting the following lines.
//if (currentFrame->timecode == 0)
// playPos = (uint64_t)
// ((currentFrame->frameNumber / video_frame_rate) * 1000);
//else
playPos = m_player->GetDecoder()->NormalizeVideoTimecode(currentFrame->timecode);
}
if (playPos != 0)
changed |= subs->HasSubtitleChanged(playPos);
if (!changed)
{
subs->Unlock();
return;
}
DeleteAllChildren();
SetRedraw();
if (playPos == 0)
{
subs->Unlock();
return;
}
QStringList rawsubs = subs->GetSubtitles(playPos);
if (rawsubs.empty())
{
subs->Unlock();
return;
}
OptimiseTextSubs(rawsubs);
subs->Unlock();
DrawTextSubtitles(rawsubs, 0, 0);
}
示例5: DisplayAVSubtitles
void SubtitleScreen::DisplayAVSubtitles(void)
{
if (!m_player || !m_subreader)
return;
AVSubtitles* subs = m_subreader->GetAVSubtitles();
QMutexLocker lock(&(subs->lock));
if (subs->buffers.empty() && (kDisplayAVSubtitle != m_subtitleType))
return;
VideoOutput *videoOut = m_player->GetVideoOutput();
VideoFrame *currentFrame = videoOut ? videoOut->GetLastShownFrame() : NULL;
if (!currentFrame || !videoOut)
return;
float tmp = 0.0;
QRect dummy;
videoOut->GetOSDBounds(dummy, m_safeArea, tmp, tmp, tmp);
while (!subs->buffers.empty())
{
const AVSubtitle subtitle = subs->buffers.front();
if (subtitle.start_display_time > currentFrame->timecode)
break;
ClearDisplayedSubtitles();
subs->buffers.pop_front();
for (std::size_t i = 0; i < subtitle.num_rects; ++i)
{
AVSubtitleRect* rect = subtitle.rects[i];
bool displaysub = true;
if (subs->buffers.size() > 0 &&
subs->buffers.front().end_display_time <
currentFrame->timecode)
{
displaysub = false;
}
if (displaysub && rect->type == SUBTITLE_BITMAP)
{
// AVSubtitleRect's image data's not guaranteed to be 4 byte
// aligned.
QSize img_size(rect->w, rect->h);
QRect img_rect(rect->x, rect->y, rect->w, rect->h);
QRect display(rect->display_x, rect->display_y,
rect->display_w, rect->display_h);
// XSUB and some DVD/DVB subs are based on the original video
// size before the video was converted. We need to guess the
// original size and allow for the difference
int right = rect->x + rect->w;
int bottom = rect->y + rect->h;
if (subs->fixPosition || (currentFrame->height < bottom) ||
(currentFrame->width < right))
{
int sd_height = 576;
if ((m_player->GetFrameRate() > 26.0f) && bottom <= 480)
sd_height = 480;
int height = ((currentFrame->height <= sd_height) &&
(bottom <= sd_height)) ? sd_height :
((currentFrame->height <= 720) && bottom <= 720)
? 720 : 1080;
int width = ((currentFrame->width <= 720) &&
(right <= 720)) ? 720 :
((currentFrame->width <= 1280) &&
(right <= 1280)) ? 1280 : 1920;
display = QRect(0, 0, width, height);
}
QRect scaled = videoOut->GetImageRect(img_rect, &display);
QImage qImage(img_size, QImage::Format_ARGB32);
for (int y = 0; y < rect->h; ++y)
{
for (int x = 0; x < rect->w; ++x)
{
const uint8_t color = rect->pict.data[0][y*rect->pict.linesize[0] + x];
const uint32_t pixel = *((uint32_t*)rect->pict.data[1]+color);
qImage.setPixel(x, y, pixel);
}
}
if (scaled.size() != img_size)
{
qImage = qImage.scaled(scaled.width(), scaled.height(),
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
MythPainter *osd_painter = videoOut->GetOSDPainter();
MythImage* image = NULL;
if (osd_painter)
image = osd_painter->GetFormatImage();
long long displayfor = subtitle.end_display_time -
subtitle.start_display_time;
if (displayfor == 0)
displayfor = 60000;
//.........这里部分代码省略.........