Allow forcing maximum number of frames per segment

This commit is contained in:
Ilari Liusvaara 2011-09-16 15:24:34 +03:00
parent 247a1ba33a
commit 1e0d57b503
4 changed files with 20 additions and 2 deletions

View file

@ -18,6 +18,7 @@ namespace
numeric_setting dbb("default-bottom-border", 0, 8191, 0);
numeric_setting dlb("default-left-border", 0, 8191, 0);
numeric_setting drb("default-right-border", 0, 8191, 0);
numeric_setting max_frames_per_segment("max-frames-per-segment", 0, 999999999, 0);
class avi_avsnoop : public av_snooper
{
@ -128,6 +129,7 @@ namespace
parameters.compression_level = (level2 > 9) ? (level2 - 9) : level2;
parameters.audio_sampling_rate = 32000;
parameters.keyframe_interval = (level2 > 9) ? 300 : 1;
parameters.max_frames_per_segment = max_frames_per_segment;
try {
vid_dumper = new avi_avsnoop(prefix, parameters);
} catch(std::bad_alloc& e) {

View file

@ -78,6 +78,7 @@ avidumper::avidumper(const std::string& _prefix, struct avi_info parameters)
compression_level = parameters.compression_level;
audio_sampling_rate = parameters.audio_sampling_rate;
keyframe_interval = parameters.keyframe_interval;
maxframes = parameters.max_frames_per_segment;
avi_open = false;
capture_error = false;
@ -215,7 +216,7 @@ void avidumper::on_frame_threaded(const uint32_t* data, uint16_t width, uint16_t
else
audio_get_ptr = commit_to;
if(segment_movi_ptr > AVI_CUTOFF - 16 * segment_chunks.size())
if(segment_movi_ptr > AVI_CUTOFF - 16 * segment_chunks.size() || (maxframes && segment_frames > maxframes))
fixup_avi_header_and_close();
uint16_t rheight = (height + 3) / 4 * 4;

View file

@ -151,6 +151,10 @@ struct avi_info
* Interval of keyframes (WARNING: >1 gives non-keyframes which AVISource() doesn't like).
*/
uint32_t keyframe_interval;
/**
* Maximum number of frames per segement (0 => infinite)
*/
uint32_t max_frames_per_segment;
};
/**
@ -197,7 +201,7 @@ public:
* throws std::bad_alloc: Not enough memory.
* throws std::runtime_error: Error closing dump.
*/
void on_end() throw(std::bad_alloc, std::runtime_error);
void on_end() throw(std::bad_alloc, std::runtime_error);
/**
* Causes current thread to become encode thread. Do not call this, the code internally uses it.
@ -227,6 +231,7 @@ private:
unsigned compression_level;
uint32_t audio_sampling_rate;
uint32_t keyframe_interval;
uint32_t maxframes;
//Previous frame.
uint16_t pwidth;
uint16_t pheight;

View file

@ -1061,6 +1061,16 @@ Set the default bottom border thickness (unless lua overrides) for dumps.
Default is 0.
\end_layout
\begin_layout Subsection
max-frames-per-segment
\end_layout
\begin_layout Standard
Maximum number of frames per dump segment (0 => unlimited).
Range 0-999999999.
Default is 0.
\end_layout
\begin_layout Section
Lua functions
\end_layout