core::mutable_frame make_frame(void* tag, core::frame_factory& frame_factory, std::shared_ptr<AVFrame> video, std::shared_ptr<AVFrame> audio) { const auto pix_desc = video ? pixel_format_desc(static_cast<AVPixelFormat>(video->format), video->width, video->height) : core::pixel_format_desc(core::pixel_format::invalid); auto frame = frame_factory.create_frame(tag, pix_desc); if (video) { for (int n = 0; n < static_cast<int>(pix_desc.planes.size()); ++n) { tbb::parallel_for(0, pix_desc.planes[n].height, [&](int y) { std::memcpy(frame.image_data(n).begin() + y * pix_desc.planes[n].linesize, video->data[n] + y * video->linesize[n], pix_desc.planes[n].linesize); }); } } if (audio) { // TODO This is a bit of a hack frame.audio_data() = std::vector<int32_t>(audio->nb_samples * 8, 0); auto dst = frame.audio_data().data(); auto src = reinterpret_cast<int32_t*>(audio->data[0]); tbb::parallel_for(0, audio->nb_samples, [&](int i) { for (auto j = 0; j < std::min(8, audio->channels); ++j) { dst[i * 8 + j] = src[i * audio->channels + j]; } }); } return frame; }
virtual safe_ptr<basic_frame> receive(int) override { auto format_desc = consumer_->get_video_format_desc(); if(frame_buffer_.size() > 0) { auto frame = frame_buffer_.front(); frame_buffer_.pop(); return last_frame_ = frame; } auto read_frame = consumer_->receive(); if(!read_frame || read_frame->image_data().empty()) return basic_frame::late(); frame_number_++; core::pixel_format_desc desc; bool double_speed = std::abs(frame_factory_->get_video_format_desc().fps / 2.0 - format_desc.fps) < 0.01; bool half_speed = std::abs(format_desc.fps / 2.0 - frame_factory_->get_video_format_desc().fps) < 0.01; if(half_speed && frame_number_ % 2 == 0) // Skip frame return receive(0); desc.pix_fmt = core::pixel_format::bgra; desc.planes.push_back(core::pixel_format_desc::plane(format_desc.width, format_desc.height, 4)); auto frame = frame_factory_->create_frame(this, desc, read_frame->multichannel_view().channel_layout()); bool copy_audio = !double_speed && !half_speed; if (copy_audio) { frame->audio_data().reserve(read_frame->audio_data().size()); boost::copy(read_frame->audio_data(), std::back_inserter(frame->audio_data())); } fast_memcpy(frame->image_data().begin(), read_frame->image_data().begin(), read_frame->image_data().size()); frame->commit(); frame_buffer_.push(frame); if(double_speed) frame_buffer_.push(frame); return receive(0); }
int main(int argc, char* argv[]) { char tmpStr[256]; col = 0; verbose_level = 1; syncwords = 0; printf("bbAINFO - version 1.7, by Brent Beyeler ([email protected])\n"); printf(" speed increases by, Apachez and Christian Vogelgsang\n\n"); if (argc < 2) { printf("\nbbAINFO is an MPEG audio stream analyzer\n"); printf("All it realy does is list the sync word headers\n\n"); printf("Usage: bbAINFO MPEG audio filename\n\n"); printf("Examples:\n"); printf(" To list all frames to file test.txt\n"); printf(" bbAINFO test.mpg > test.txt\n\n"); exit (1); } init_getbits(argv[1]); strcpy(tmpStr, argv[1]); // strlwr(tmpStr); if (argc > 2) { sscanf(argv[2], "%d", &verbose_level); if (verbose_level < 1) verbose_level = 1; if (verbose_level > 3) verbose_level = 3; } if (nextbits(12) != SYNCWORD) { printf("\nFile is not an MPEG Audio Stream\n"); exit(1); } do { header(); error_check(); audio_data(); ancillary_data(); } while (!end_bs()); printf("\nFound %u sync words\n", syncwords); printf("\nHeader info summary:\n"); switch (layer) { case 0: printf(" layer = reserved\n"); break; case LAYER_1: printf(" layer = 1\n"); break; case LAYER_2: printf(" layer = 2\n"); break; case LAYER_3: printf(" layer = 3\n"); break; } printf(" bitrate = %d Kbps\n", bitrate_index[3 - layer][bit_rate]); printf(" frequency = %.1f kHz\n", frequency[freq]); if (protection) printf(" error protection = disabled\n"); else printf(" error protection = enabled\n"); printf(" private flag = %d\n", private_bit); switch (mode) { case 0: printf(" mode = stereo\n"); break; case 1: printf(" mode = joint_stereo (intensity_stereo and/or ms_stereo)\n"); break; case 2: printf(" mode = dual_channel\n"); break; case 3: printf(" mode = single_channel\n"); } if (layer == LAYER_3) { switch (mode_ext) { case 0: printf(" mode ext = intensity stereo is off, ms stereo is off\n"); break; case 1: printf(" mode ext = intensity stereo is on, ms stereo is off\n"); break; case 2: printf(" mode ext = intensity stereo is off, ms stereo is on\n"); break; case 3: printf(" mode ext = intensity stereo is on, ms stereo is on\n"); } } else { if (mode == 1) { switch (mode_ext) { case 0: printf(" mode ext = subbands 4-31 in intensity_stereo, bound==4\n"); break; case 1: printf(" mode ext = subbands 8-31 in intensity_stereo, bound==8\n"); break; case 2: printf(" mode ext = subbands 12-31 in intensity_stereo, bound==12\n"); break; case 3: printf(" mode ext = subbands 16-31 in intensity_stereo, bound==16\n"); } } } printf(" copyright flag = %d\n", copyright); printf(" original flag = %d\n", original); switch (emphasis) { case 0: printf(" emphasis = none\n"); break; case 1: printf(" emphasis = 50/15 microsec. emphasis\n"); break; case 2: printf(" emphasis = reserved\n"); break; case 3: printf(" emphasis = CCITT J.17\n"); } finish_getbits(); return (0); }