VirtualBox

source: vbox/trunk/src/VBox/Main/include/VideoRecStream.h@ 74992

Last change on this file since 74992 was 74992, checked in by vboxsync, 7 years ago

VideoRec/Main: Split up code into more modules for easier maintenance.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1/* $Id: VideoRecStream.h 74992 2018-10-23 11:09:22Z vboxsync $ */
2/** @file
3 * Video recording stream code header.
4 */
5
6/*
7 * Copyright (C) 2012-2018 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ____H_VIDEOREC_STREAM
19#define ____H_VIDEOREC_STREAM
20
21#include <VBox/com/array.h>
22#include <VBox/com/VirtualBox.h>
23#include <VBox/err.h>
24
25#include "WebMWriter.h"
26#include "VideoRecInternals.h"
27
28
29struct VIDEORECCFG;
30typedef struct VIDEORECCFG *PVIDEORECCFG;
31
32struct VIDEORECCONTEXT;
33typedef struct VIDEORECCONTEXT *PVIDEORECCONTEXT;
34
35
36/** Structure for queuing all blocks bound to a single timecode.
37 * This can happen if multiple tracks are being involved. */
38struct VideoRecBlocks
39{
40 virtual ~VideoRecBlocks()
41 {
42 Clear();
43 }
44
45 /**
46 * Resets a video recording block list by removing (destroying)
47 * all current elements.
48 */
49 void Clear()
50 {
51 while (!List.empty())
52 {
53 PVIDEORECBLOCK pBlock = List.front();
54 VideoRecBlockFree(pBlock);
55 List.pop_front();
56 }
57
58 Assert(List.size() == 0);
59 }
60
61 /** The actual block list for this timecode. */
62 VideoRecBlockList List;
63};
64
65/** A block map containing all currently queued blocks.
66 * The key specifies a unique timecode, whereas the value
67 * is a list of blocks which all correlate to the same key (timecode). */
68typedef std::map<uint64_t, VideoRecBlocks *> VideoRecBlockMap;
69
70/**
71 * Structure for holding a set of video recording (data) blocks.
72 */
73struct VideoRecBlockSet
74{
75 virtual ~VideoRecBlockSet()
76 {
77 Clear();
78 }
79
80 /**
81 * Resets a video recording block set by removing (destroying)
82 * all current elements.
83 */
84 void Clear()
85 {
86 VideoRecBlockMap::iterator it = Map.begin();
87 while (it != Map.end())
88 {
89 it->second->Clear();
90 delete it->second;
91 Map.erase(it);
92 it = Map.begin();
93 }
94
95 Assert(Map.size() == 0);
96 }
97
98 /** Timestamp (in ms) when this set was last processed. */
99 uint64_t tsLastProcessedMs;
100 /** All blocks related to this block set. */
101 VideoRecBlockMap Map;
102};
103
104/**
105 * Structure for maintaining a video recording stream.
106 */
107typedef struct VIDEORECSTREAM
108{
109 /** Video recording context this stream is associated to. */
110 PVIDEORECCONTEXT pCtx;
111 /** Destination where to write the stream to. */
112 VIDEORECDEST enmDst;
113 union
114 {
115 struct
116 {
117 /** File handle to use for writing. */
118 RTFILE hFile;
119 /** File name being used for this stream. */
120 char *pszFile;
121 /** Pointer to WebM writer instance being used. */
122 WebMWriter *pWEBM;
123 } File;
124 };
125#ifdef VBOX_WITH_AUDIO_VIDEOREC
126 /** Track number of audio stream. */
127 uint8_t uTrackAudio;
128#endif
129 /** Track number of video stream. */
130 uint8_t uTrackVideo;
131 /** Screen ID. */
132 uint16_t uScreenID;
133 /** Whether video recording is enabled or not. */
134 bool fEnabled;
135 /** Critical section to serialize access. */
136 RTCRITSECT CritSect;
137
138 struct
139 {
140 /** Codec-specific data. */
141 VIDEORECVIDEOCODEC Codec;
142 /** Minimal delay (in ms) between two video frames.
143 * This value is based on the configured FPS rate. */
144 uint32_t uDelayMs;
145 /** Target X resolution (in pixels). */
146 uint32_t uWidth;
147 /** Target Y resolution (in pixels). */
148 uint32_t uHeight;
149 /** Time stamp (in ms) of the last video frame we encoded. */
150 uint64_t uLastTimeStampMs;
151 /** Number of failed attempts to encode the current video frame in a row. */
152 uint16_t cFailedEncodingFrames;
153 } Video;
154
155 /** Common set of video recording (data) blocks, needed for
156 * multiplexing to all recording streams. */
157 VideoRecBlockSet Blocks;
158} VIDEORECSTREAM, *PVIDEORECSTREAM;
159
160/** Vector of video recording streams. */
161typedef std::vector <PVIDEORECSTREAM> VideoRecStreams;
162
163int videoRecStreamClose(PVIDEORECSTREAM pStream);
164PVIDEORECSTREAM videoRecStreamGet(PVIDEORECCONTEXT pCtx, uint32_t uScreen);
165int videoRecStreamOpen(PVIDEORECSTREAM pStream, PVIDEORECCFG pCfg);
166int videoRecStreamUninit(PVIDEORECSTREAM pStream);
167int videoRecStreamUnitVideo(PVIDEORECSTREAM pStream);
168int videoRecStreamInitVideo(PVIDEORECSTREAM pStream, PVIDEORECCFG pCfg);
169#ifdef VBOX_WITH_LIBVPX
170int videoRecStreamInitVideoVPX(PVIDEORECSTREAM pStream, PVIDEORECCFG pCfg);
171int videoRecStreamUninitVideoVPX(PVIDEORECSTREAM pStream);
172int videoRecStreamWriteVideoVPX(PVIDEORECSTREAM pStream, uint64_t uTimeStampMs, PVIDEORECVIDEOFRAME pFrame);
173#endif
174void videoRecStreamLock(PVIDEORECSTREAM pStream);
175void videoRecStreamUnlock(PVIDEORECSTREAM pStream);
176
177#endif /* ____H_VIDEOREC_STREAM */
178
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette