| 
														
															@@ -15,25 +15,25 @@ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 const uint8_t VideoStream::endcode[] = { 0, 0, 1, 0xb7 }; 
														 | 
														
														 | 
														
															 const uint8_t VideoStream::endcode[] = { 0, 0, 1, 0xb7 }; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-VideoStream::VideoStream(::size_t width, ::size_t height, const std::string& filename) : 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    width{ width }, height{ height } 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+VideoStream::VideoStream(int width, int height, const std::string& filename) : 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    width{ width & (~1) }, height{ height & (~1) } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    avcodec_register_all(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    // only needed with ffmpeg version < 4 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    //avcodec_register_all(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    codec = avcodec_find_encoder(AV_CODEC_ID_MPEG4); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    codec = avcodec_find_encoder(AV_CODEC_ID_H264); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (!codec) { 
														 | 
														
														 | 
														
															     if (!codec) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         fprintf(stderr, "invalid codec\n"); 
														 | 
														
														 | 
														
															         fprintf(stderr, "invalid codec\n"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         exit(1); 
														 | 
														
														 | 
														
															         exit(1); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     codecContext = avcodec_alloc_context3(codec); 
														 | 
														
														 | 
														
															     codecContext = avcodec_alloc_context3(codec); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    picture = av_frame_alloc(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     pkt = av_packet_alloc(); 
														 | 
														
														 | 
														
															     pkt = av_packet_alloc(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (!pkt) 
														 | 
														
														 | 
														
															     if (!pkt) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         exit(1); 
														 | 
														
														 | 
														
															         exit(1); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    codecContext->bit_rate = 100 * 1000 * 1000; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    codecContext->bit_rate = 50 * 1000 * 1000; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     codecContext->width = width; 
														 | 
														
														 | 
														
															     codecContext->width = width; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     codecContext->height = height; 
														 | 
														
														 | 
														
															     codecContext->height = height; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     codecContext->time_base = AVRational{ 1, 60 }; 
														 | 
														
														 | 
														
															     codecContext->time_base = AVRational{ 1, 60 }; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -43,6 +43,9 @@ VideoStream::VideoStream(::size_t width, ::size_t height, const std::string& fil 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     codecContext->max_b_frames = 1; 
														 | 
														
														 | 
														
															     codecContext->max_b_frames = 1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     codecContext->pix_fmt = AV_PIX_FMT_YUV420P; 
														 | 
														
														 | 
														
															     codecContext->pix_fmt = AV_PIX_FMT_YUV420P; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    if (codec->id == AV_CODEC_ID_H264) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        av_opt_set(codecContext->priv_data, "preset", "slow", 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (avcodec_open2(codecContext, codec, nullptr) < 0) { 
														 | 
														
														 | 
														
															     if (avcodec_open2(codecContext, codec, nullptr) < 0) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         fprintf(stderr, "could not open codec\n"); 
														 | 
														
														 | 
														
															         fprintf(stderr, "could not open codec\n"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         exit(1); 
														 | 
														
														 | 
														
															         exit(1); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -54,6 +57,7 @@ VideoStream::VideoStream(::size_t width, ::size_t height, const std::string& fil 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         exit(1); 
														 | 
														
														 | 
														
															         exit(1); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    picture = av_frame_alloc(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     picture->format = codecContext->pix_fmt; 
														 | 
														
														 | 
														
															     picture->format = codecContext->pix_fmt; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     picture->width  = codecContext->width; 
														 | 
														
														 | 
														
															     picture->width  = codecContext->width; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     picture->height = codecContext->height; 
														 | 
														
														 | 
														
															     picture->height = codecContext->height; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -102,7 +106,7 @@ static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 VideoStream::~VideoStream() 
														 | 
														
														 | 
														
															 VideoStream::~VideoStream() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     /* flush the encoder */ 
														 | 
														
														 | 
														
															     /* flush the encoder */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    encode(codecContext, NULL, pkt, file); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    encode(codecContext, nullptr, pkt, file); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     /* add sequence end code to have a real MPEG file */ 
														 | 
														
														 | 
														
															     /* add sequence end code to have a real MPEG file */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     fwrite(endcode, 1, sizeof(endcode), file); 
														 | 
														
														 | 
														
															     fwrite(endcode, 1, sizeof(endcode), file); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -111,6 +115,32 @@ VideoStream::~VideoStream() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     avcodec_free_context(&codecContext); 
														 | 
														
														 | 
														
															     avcodec_free_context(&codecContext); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     av_frame_free(&picture); 
														 | 
														
														 | 
														
															     av_frame_free(&picture); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     av_packet_free(&pkt); 
														 | 
														
														 | 
														
															     av_packet_free(&pkt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+/* 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    AVPacket pkt; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    av_init_packet(&pkt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    pkt.data = nullptr; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    pkt.size = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    for (;;) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        avcodec_send_frame(codecContext, NULL); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (avcodec_receive_packet(codecContext, &pkt) == 0) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            av_interleaved_write_frame(codecContext, &pkt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            av_packet_unref(&pkt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        else { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            break; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    av_write_trailer(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    if (!(oformat->flags & AVFMT_NOFILE)) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        int err = avio_close(ofctx->pb); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (err < 0) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            Debug("Failed to close file", err); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    }*/ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 |