1 #include "video/avi/writer.hpp"
2 #include "core/framerate.hpp"
3 #include "core/messages.hpp"
7 avi_writer::~avi_writer()
16 std::deque
<frame_object
>& avi_writer::video_queue()
21 sample_queue
& avi_writer::audio_queue()
26 void avi_writer::flush()
31 void avi_writer::close()
37 curwidth
= curheight
= curfps_n
= curfps_d
= 0;
40 void avi_writer::flush(bool force
)
47 sbreak
= true; //Start first segment.
48 if(aviout
.get_size_estimate() > 2100000000)
49 sbreak
= true; //Break due to size.
50 struct frame_object
& f
= vqueue
.front();
52 sbreak
= true; //Manual force break.
53 if(f
.width
!= curwidth
|| f
.height
!= curheight
|| f
.fps_n
!= curfps_n
|| f
.fps_d
!= curfps_d
)
54 sbreak
= true; //Break due resolution / rate change.
68 x
<< prefix
<< "_" << std::setw(5) << std::setfill('0') << next_segment
<< ".avi";
71 avifile
.open(aviname
, std::ios::out
| std::ios::binary
);
73 throw std::runtime_error("Can't open '" + aviname
+ "'");
75 aviout
.start(avifile
, vcodec
, acodec
, curwidth
, curheight
, curfps_n
, curfps_d
, samplerate
,
78 messages
<< "Start AVI: " << curwidth
<< "x" << curheight
<< "@" << curfps_n
<< "/" << curfps_d
79 << " to '" << aviname
<< "'" << std::endl
;
81 uint64_t t
= framerate_regulator::get_utime();
82 if(aviout
.readqueue(f
.data
, f
.odata
, f
.stride
, aqueue
, force
)) {
83 t
= framerate_regulator::get_utime() - t
;
85 std::cerr
<< "aviout.readqueue took " << t
<< std::endl
;
91 avi_writer::avi_writer(const std::string
& _prefix
, struct avi_video_codec
& _vcodec
, struct avi_audio_codec
& _acodec
,
92 uint32_t _samplerate
, uint16_t _audiochannels
)
93 : vcodec(_vcodec
), acodec(_acodec
)
98 samplerate
= _samplerate
;
99 channels
= _audiochannels
;
100 curwidth
= curheight
= curfps_n
= curfps_d
= 0;