const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { if (!_nextVideoTrack) return 0; const Graphics::Surface *frame = _nextVideoTrack->decodeNextFrame(); if (!_setStartTime) { _startTime = g_system->getMillis(); _setStartTime = true; } _nextVideoTrack = findNextVideoTrack(); _needUpdate = false; // Update audio buffers too // (needs to be done after we find the next track) updateAudioBuffer(); // We have to initialize the scaled surface if (frame && (_scaleFactorX != 1 || _scaleFactorY != 1)) { if (!_scaledSurface) { _scaledSurface = new Graphics::Surface(); _scaledSurface->create(_width, _height, getPixelFormat()); } scaleSurface(frame, _scaledSurface, _scaleFactorX, _scaleFactorY); return _scaledSurface; } return frame; }
const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { if (!_nextVideoTrack) return 0; const Graphics::Surface *frame = _nextVideoTrack->decodeNextFrame(); if (!_setStartTime) { _startTime = g_system->getMillis(); _setStartTime = true; } _nextVideoTrack = findNextVideoTrack(); _needUpdate = false; // Update audio buffers too // (needs to be done after we find the next track) updateAudioBuffer(); if (_scaledSurface) { scaleSurface(frame, _scaledSurface, _scaleFactorX, _scaleFactorY); return _scaledSurface; } return frame; }
const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { if (_videoStreamIndex < 0 || _curFrame >= (int32)getFrameCount() - 1) return 0; if (_startTime == 0) _startTime = g_system->getMillis(); _curFrame++; _nextFrameStartTime += getFrameDuration(); // Update the audio while we're at it updateAudioBuffer(); // Get the next packet uint32 descId; Common::SeekableReadStream *frameData = getNextFramePacket(descId); if (!frameData || !descId || descId > _streams[_videoStreamIndex]->stsdEntryCount) return 0; // Find which video description entry we want STSDEntry *entry = &_streams[_videoStreamIndex]->stsdEntries[descId - 1]; if (!entry->videoCodec) return 0; const Graphics::Surface *frame = entry->videoCodec->decodeImage(frameData); delete frameData; // Update the palette if (entry->videoCodec->containsPalette()) { // The codec itself contains a palette if (entry->videoCodec->hasDirtyPalette()) { _palette = entry->videoCodec->getPalette(); _dirtyPalette = true; } } else { // Check if the video description has been updated byte *palette = entry->palette; if (palette != _palette) { _palette = palette; _dirtyPalette = true; } } return scaleSurface(frame); }
const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() { const Graphics::Surface *frame = VideoDecoder::decodeNextFrame(); // Update audio buffers too // (needs to be done after we find the next track) updateAudioBuffer(); // We have to initialize the scaled surface if (frame && (_scaleFactorX != 1 || _scaleFactorY != 1)) { if (!_scaledSurface) { _scaledSurface = new Graphics::Surface(); _scaledSurface->create(_width, _height, getPixelFormat()); } scaleSurface(frame, _scaledSurface, _scaleFactorX, _scaleFactorY); return _scaledSurface; } return frame; }
static int createPreviews(create_previews_args *args) { unsigned int tile_count = 0; unsigned int tile_total = 0; double progress_total; char overlay_text[50]; for (int i = 0; i < args->runs; i++) tile_total += (args->experiments[i].seg * args->experiments[i].seg * 15); progress_total = tile_total; for (unsigned int run = 0; run < args->runs; run++) { unsigned int seg = args->experiments[run].seg; unsigned int tiles = seg * seg * 15; previews[run] = malloc(tiles * sizeof(SDL_Surface*) ); if (previews[run] == NULL) { // malloc(...) error fprintf(stderr, "Error allocating preview memory for run %d.\n", run); return 1; } sprintf(overlay_text, "%c", run + 65); // +65 for A..F for (unsigned int tile = 0; tile < tiles; tile++) { previews[run][tile] = addOverlayLetter( addCorners( scaleSurface( makeTile(tileset[run][tile], seg), args->preview_size ) ), // scaleSurfaceBlended takes too long! overlay_text ); tile_count++; *args->progress = tile_count / progress_total; } } return 0; }
HRESULT DeviceResources::RetrieveBackBuffer(char* buffer, DWORD width, DWORD height, DWORD bpp) { HRESULT hr = S_OK; char* step = ""; memset(buffer, 0, width * height * bpp); D3D11_TEXTURE2D_DESC textureDescription; this->_backBuffer->GetDesc(&textureDescription); textureDescription.BindFlags = 0; textureDescription.SampleDesc.Count = 1; textureDescription.SampleDesc.Quality = 0; ComPtr<ID3D11Texture2D> backBuffer; textureDescription.Usage = D3D11_USAGE_DEFAULT; textureDescription.CPUAccessFlags = 0; step = "Resolve BackBuffer"; if (SUCCEEDED(hr = this->_d3dDevice->CreateTexture2D(&textureDescription, nullptr, &backBuffer))) { this->_d3dDeviceContext->ResolveSubresource(backBuffer, D3D11CalcSubresource(0, 0, 1), this->_backBuffer, D3D11CalcSubresource(0, 0, 1), textureDescription.Format); step = "Staging Texture2D"; ComPtr<ID3D11Texture2D> texture; textureDescription.Usage = D3D11_USAGE_STAGING; textureDescription.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; if (SUCCEEDED(hr = this->_d3dDevice->CreateTexture2D(&textureDescription, nullptr, &texture))) { this->_d3dDeviceContext->CopyResource(texture, backBuffer); step = "Map"; D3D11_MAPPED_SUBRESOURCE map; if (SUCCEEDED(hr = this->_d3dDeviceContext->Map(texture, 0, D3D11_MAP_READ, 0, &map))) { step = "copy"; if (bpp == 4 && width == this->_backbufferWidth && height == this->_backbufferHeight) { memcpy(buffer, map.pData, width * height * 4); } else { scaleSurface(buffer, width, height, bpp, (char*)map.pData, this->_backbufferWidth, this->_backbufferHeight, 4); } this->_d3dDeviceContext->Unmap(texture, 0); } } } if (FAILED(hr)) { static bool messageShown = false; if (!messageShown) { char text[512]; strcpy_s(text, step); strcat_s(text, "\n"); strcat_s(text, _com_error(hr).ErrorMessage()); MessageBox(nullptr, text, __FUNCTION__, MB_ICONERROR); } messageShown = true; } return hr; }