X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.cpp;h=559c33760c96965c6804537b0fb29d2c37cefe0c;hb=b18056fe32dd46134d7f12165bfa083378f2d9bb;hp=663a235f05a75698283d6dd5f5ea59295c2f0db3;hpb=8b4a8b1610810c50ac7afe68577cd86cf04b2b06;p=bmusb diff --git a/bmusb.cpp b/bmusb.cpp index 663a235..559c337 100644 --- a/bmusb.cpp +++ b/bmusb.cpp @@ -199,6 +199,7 @@ bool decode_video_format(uint16_t video_format, VideoFormat *decoded_video_forma constexpr VideoFormatEntry entries[] = { { 0x01f1, 720, 480, 0, 40, 5, 60000, 1001, false }, // 480p59.94 (believed). { 0x0131, 720, 576, 0, 44, 5, 50, 1, false }, // 576p50. + { 0x0151, 720, 576, 0, 44, 5, 50, 1, false }, // 576p50. { 0x0011, 720, 576, 0, 44, 5, 50, 1, false }, // 576p50 (5:4). { 0x0143, 1280, 720, 0, 25, 5, 50, 1, false }, // 720p50. { 0x0103, 1280, 720, 0, 25, 5, 60, 1, false }, // 720p60. @@ -243,7 +244,7 @@ bool decode_video_format(uint16_t video_format, VideoFormat *decoded_video_forma // There are seemingly no direct indicators of sample rate; you just get // one frame's worth and have to guess from that. -int guess_sample_rate(const VideoFormat &video_format, size_t len) +int guess_sample_rate(const VideoFormat &video_format, size_t len, int default_rate) { size_t num_samples = len / 3 / 8; size_t num_samples_per_second = num_samples * video_format.frame_rate_nom / video_format.frame_rate_den; @@ -256,9 +257,9 @@ int guess_sample_rate(const VideoFormat &video_format, size_t len) } } - fprintf(stderr, "%ld samples at %d/%d fps (%ld Hz) matches no known sample rate, assuming 48000 Hz\n", - num_samples, video_format.frame_rate_nom, video_format.frame_rate_den, num_samples_per_second); - return 48000; + fprintf(stderr, "%ld samples at %d/%d fps (%ld Hz) matches no known sample rate, keeping capture at %d Hz\n", + num_samples, video_format.frame_rate_nom, video_format.frame_rate_den, num_samples_per_second, default_rate); + return default_rate; } } // namespace @@ -406,13 +407,14 @@ void BMUSBCapture::dequeue_thread_func() audio_format.id = audio_frame.format; if (decode_video_format(video_frame.format, &video_format)) { if (audio_frame.frame.len != 0) { - audio_format.sample_rate = guess_sample_rate(video_format, audio_frame.frame.len); + audio_format.sample_rate = guess_sample_rate(video_format, audio_frame.frame.len, last_sample_rate); last_sample_rate = audio_format.sample_rate; } frame_callback(video_timecode, video_frame.frame, HEADER_SIZE, video_format, audio_frame.frame, AUDIO_HEADER_SIZE, audio_format); } else { + video_frame_allocator->release_frame(video_frame.frame); audio_format.sample_rate = last_sample_rate; frame_callback(video_timecode, FrameAllocator::Frame(), 0, video_format,