1 // Hardware H.264 encoding via VAAPI. Heavily modified based on example
2 // code by Intel. Intel's original copyright and license is reproduced below:
4 // Copyright (c) 2007-2013 Intel Corporation. All Rights Reserved.
6 // Permission is hereby granted, free of charge, to any person obtaining a
7 // copy of this software and associated documentation files (the
8 // "Software"), to deal in the Software without restriction, including
9 // without limitation the rights to use, copy, modify, merge, publish,
10 // distribute, sub license, and/or sell copies of the Software, and to
11 // permit persons to whom the Software is furnished to do so, subject to
12 // the following conditions:
14 // The above copyright notice and this permission notice (including the
15 // next paragraph) shall be included in all copies or substantial portions
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 // IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
22 // ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 #include <libavcodec/avcodec.h>
31 #include <libavformat/avformat.h>
37 #include <condition_variable>
45 #include "bmusb/bmusb.h"
47 #include "pbo_frame_allocator.h"
48 #include "ref_counted_frame.h"
49 #include "ref_counted_gl_sync.h"
54 #define SURFACE_NUM 16 /* 16 surfaces for source YUV */
58 H264Encoder(QSurface *surface, int width, int height, HTTPD *httpd);
60 //void add_frame(FrameAllocator::Frame frame, GLsync fence);
66 GLuint y_tex, cbcr_tex;
73 void add_audio(int64_t pts, std::vector<float> audio); // Needs to come before end_frame() of same pts.
74 bool begin_frame(GLuint *y_tex, GLuint *cbcr_tex);
75 void end_frame(RefCountedGLsync fence, int64_t pts, const std::vector<RefCountedFrame> &input_frames);
79 unsigned long long display_order;
81 std::vector<float> audio;
85 void copy_thread_func();
86 void storage_task_thread();
87 void storage_task_enqueue(storage_task task);
88 int save_codeddata(storage_task task);
90 std::thread copy_thread, storage_thread;
92 std::mutex storage_task_queue_mutex;
93 std::condition_variable storage_task_queue_changed;
94 int srcsurface_status[SURFACE_NUM]; // protected by storage_task_queue_mutex
95 std::queue<storage_task> storage_task_queue; // protected by storage_task_queue_mutex
96 bool storage_thread_should_quit = false; // protected by storage_task_queue_mutex
98 std::mutex frame_queue_mutex;
99 std::condition_variable frame_queue_nonempty;
100 bool copy_thread_should_quit = false; // under frame_queue_mutex
102 //int frame_width, frame_height;
104 int current_storage_frame;
106 struct PendingFrame {
107 RefCountedGLsync fence;
108 std::vector<RefCountedFrame> input_frames;
111 std::map<int, PendingFrame> pending_video_frames; // under frame_queue_mutex
112 std::map<int64_t, std::vector<float>> pending_audio_frames; // under frame_queue_mutex
115 AVCodecContext *context_audio;