| 
									
										
										
										
											2020-07-21 09:26:59 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Copyright (c) 2014 The WebM project authors. All Rights Reserved. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* This Source Code Form is subject to the terms of the Mozilla Public
 | 
					
						
							|  |  |  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | 
					
						
							|  |  |  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "WebMFileWriter.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 10:02:14 -07:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2020-07-21 09:26:59 -07:00
										 |  |  | #include "mkvmuxer/mkvmuxerutil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace mozilla { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebMFileWriter::WebMFileWriter(FILE* file, vpx_codec_enc_cfg_t* cfg) | 
					
						
							|  |  |  |     : m_cfg(cfg) | 
					
						
							|  |  |  |     , m_writer(new mkvmuxer::MkvWriter(file)) | 
					
						
							|  |  |  |     , m_segment(new mkvmuxer::Segment()) { | 
					
						
							|  |  |  |   m_segment->Init(m_writer.get()); | 
					
						
							|  |  |  |   m_segment->set_mode(mkvmuxer::Segment::kFile); | 
					
						
							|  |  |  |   m_segment->OutputCues(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   mkvmuxer::SegmentInfo* info = m_segment->GetSegmentInfo(); | 
					
						
							|  |  |  |   std::string version = "Playwright " + std::string(vpx_codec_version_str()); | 
					
						
							|  |  |  |   info->set_writing_app(version.c_str()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Add vp8 track.
 | 
					
						
							|  |  |  |   m_videoTrackId = m_segment->AddVideoTrack( | 
					
						
							|  |  |  |       static_cast<int>(m_cfg->g_w), static_cast<int>(m_cfg->g_h), 0); | 
					
						
							|  |  |  |   if (!m_videoTrackId) { | 
					
						
							|  |  |  |     fprintf(stderr, "Failed to add video track\n"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebMFileWriter::~WebMFileWriter() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebMFileWriter::writeFrame(const vpx_codec_cx_pkt_t* pkt) { | 
					
						
							|  |  |  |   int64_t pts_ns = pkt->data.frame.pts * 1000000000ll * m_cfg->g_timebase.num / | 
					
						
							|  |  |  |                    m_cfg->g_timebase.den; | 
					
						
							|  |  |  |   m_segment->AddFrame(static_cast<uint8_t*>(pkt->data.frame.buf), | 
					
						
							|  |  |  |                       pkt->data.frame.sz, m_videoTrackId, pts_ns, | 
					
						
							|  |  |  |                       pkt->data.frame.flags & VPX_FRAME_IS_KEY); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebMFileWriter::finish() { | 
					
						
							|  |  |  |   m_segment->Finalize(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace mozilla
 |