Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
	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);
	}	
Ejemplo n.º 3
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);
}