#define WIDTH 1280
#define HEIGHT 720
+#define EXTRAHEIGHT 30
#undef Success
} // namespace
Mixer::Mixer(const QSurfaceFormat &format)
- : mixer_surface(create_surface(format)),
+ : httpd("test.ts", WIDTH, HEIGHT),
+ mixer_surface(create_surface(format)),
h264_encoder_surface(create_surface(format))
{
+ httpd.start(9095);
+
CHECK(init_movit(MOVIT_SHADER_DIR, MOVIT_DEBUG_OFF));
check_error();
display_chain->set_dither_bits(0); // Don't bother.
display_chain->finalize();
- h264_encoder.reset(new H264Encoder(h264_encoder_surface, WIDTH, HEIGHT, "test.mp4"));
+ h264_encoder.reset(new H264Encoder(h264_encoder_surface, WIDTH, HEIGHT, &httpd));
for (int card_index = 0; card_index < NUM_CARDS; ++card_index) {
printf("Configuring card %d...\n", card_index);
CaptureCard *card = &cards[card_index];
- card->usb = new BMUSBCapture(0x1edb, card_index == 0 ? 0xbd3b : 0xbd4f);
+ card->usb = new BMUSBCapture(card_index);
card->usb->set_frame_callback(bind(&Mixer::bm_frame, this, card_index, _1, _2, _3, _4, _5, _6, _7));
- card->frame_allocator.reset(new PBOFrameAllocator(1280 * 750 * 2 + 44, 1280, 720));
+ card->frame_allocator.reset(new PBOFrameAllocator(WIDTH * (HEIGHT+EXTRAHEIGHT) * 2 + 44, WIDTH, HEIGHT));
card->usb->set_video_frame_allocator(card->frame_allocator.get());
card->surface = create_surface(format);
card->usb->set_dequeue_thread_callbacks(
printf("failed to create bmusb context\n");
exit(1);
}
- printf("inited!\n");
},
[this]{
resource_pool->clean_context();
" gl_FragColor = texture2D(cbcr_tex, tc0); \n"
"} \n";
cbcr_program_num = resource_pool->compile_glsl_program(cbcr_vert_shader, cbcr_frag_shader);
+
+ r128_state = ebur128_init(2, 48000, EBUR128_MODE_SAMPLE_PEAK | EBUR128_MODE_M | EBUR128_MODE_S | EBUR128_MODE_I | EBUR128_MODE_LRA);
}
Mixer::~Mixer()
}
cards[card_index].usb->stop_dequeue_thread();
}
+
+ ebur128_destroy(&r128_state);
}
namespace {
if (card->should_quit) return;
}
- if (video_frame.len - video_offset != 1280 * 750 * 2) {
+ if (video_frame.len - video_offset != WIDTH * (HEIGHT+EXTRAHEIGHT) * 2) {
if (video_frame.len != 0) {
printf("Card %d: Dropping video frame with wrong length (%ld)\n",
card_index, video_frame.len - video_offset);
// Upload the textures.
glBindTexture(GL_TEXTURE_2D, userdata->tex_y);
check_error();
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1280, 720, GL_RED, GL_UNSIGNED_BYTE, BUFFER_OFFSET((1280 * 750 * 2 + 44) / 2 + 1280 * 25 + 22));
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_RED, GL_UNSIGNED_BYTE, BUFFER_OFFSET((WIDTH * (HEIGHT+EXTRAHEIGHT) * 2 + 44) / 2 + WIDTH * 25 + 22));
check_error();
glBindTexture(GL_TEXTURE_2D, userdata->tex_cbcr);
check_error();
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1280/2, 720, GL_RG, GL_UNSIGNED_BYTE, BUFFER_OFFSET(1280 * 25 + 22));
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH/2, HEIGHT, GL_RG, GL_UNSIGNED_BYTE, BUFFER_OFFSET(WIDTH * 25 + 22));
check_error();
glBindTexture(GL_TEXTURE_2D, 0);
check_error();
}
}
if (card_index == 0) {
+ ebur128_add_frames_float(r128_state, samples_out.data(), samples_out.size() / 2);
h264_encoder->add_audio(pts_int, move(samples_out));
}
}
}
}
+ if (audio_level_callback != nullptr) {
+ double loudness_s;
+ ebur128_loudness_shortterm(r128_state, &loudness_s);
+ audio_level_callback(loudness_s);
+ }
+
// If the first card is reporting a corrupted or otherwise dropped frame,
// just increase the pts (skipping over this frame) and don't try to compute anything new.
if (card_copy[0].new_frame->len == 0) {