Exemplo n.º 1
0
int apeg_play_memory_mpg(void *mpeg_data, BITMAP *bmp, int loop, int (*callback)(BITMAP *tempBuffer))
{
	int ret;

	Initialize_Decoder();

	apeg_stream = apeg_open_memory_stream(mpeg_data, mem_buffer_size);
	if(!apeg_stream)
		return APEG_ERROR;

	if(bmp)
		clear_to_color(bmp, makecol(0, 0, 0));

	if(callback)
		callback_proc = callback;
	else
		callback_proc = default_callback;

restart_loop:
	ret = decode_stream((APEG_LAYER*)apeg_stream, bmp);
	if(loop && ret == APEG_OK)
	{
		apeg_reset_stream(apeg_stream);
		goto restart_loop;
	}

	apeg_close_stream(apeg_stream);
	apeg_stream = NULL;

	return ret;
}
Exemplo n.º 2
0
APEG_STREAM *apeg_open_stream_ex(void *ptr)
{
	APEG_LAYER *layer;

	Initialize_Decoder();

	layer = new_apeg_stream();
	if(!layer)
		return NULL;

	if(setjmp(jmp_buffer))
	{
		apeg_close_stream((APEG_STREAM*)layer);
		return NULL;
	}

	layer->ext_data.init = _init_func;
	layer->ext_data.request = _request_func;
	layer->ext_data.skip = _skip_func;
	layer->ext_data.ptr = ptr;

	layer->pf = pack_fopen_vtable(&ext_vtable, layer);
	if(!layer->pf)
		apeg_error_jump("Could not open stream");
	layer->buffer_type = USER_BUFFER;

	setup_stream(layer);

	return (APEG_STREAM*)layer;
}
Exemplo n.º 3
0
APEG_STREAM *apeg_open_memory_stream(void *mpeg_data, int data_len)
{
	APEG_LAYER *layer;

	Initialize_Decoder();

	layer = new_apeg_stream();
	if(!layer)
		return NULL;

	if(setjmp(jmp_buffer))
	{
		apeg_close_stream((APEG_STREAM*)layer);
		return NULL;
	}

	layer->mem_data.buf = mpeg_data;
	layer->mem_data.bytes_left = data_len;
	layer->pf = pack_fopen_vtable(&mem_vtable, layer);
	if(!layer->pf)
		apeg_error_jump("Could not open stream");

	layer->buffer_type = MEMORY_BUFFER;
	layer->buffer_size = data_len;

	setup_stream(layer);

	return (APEG_STREAM*)layer;
}
Exemplo n.º 4
0
// Open an MPEG or Ogg file. Returns a structure for stream manipulation.
APEG_STREAM *apeg_open_stream(const char *filename)
{
	APEG_LAYER *layer;

	// Initialize the decoder
	Initialize_Decoder();

	// Create a new stream structure
	layer = new_apeg_stream();
	if(!layer)
		return NULL;

	// Set the jump position in case the decoder faults on opening.
	if(setjmp(jmp_buffer))
	{
		apeg_close_stream((APEG_STREAM*)layer);
		return NULL;
	}

	// Copy the filename so we can (re)open the file when the buffer
	// gets initialized
	layer->fname = strdup(filename);
	if(!layer->fname)
		apeg_error_jump("Couldn't duplicate filename");

	// Set the buffer type and size
	layer->buffer_type = DISK_BUFFER;
	layer->buffer_size = F_BUF_SIZE;

	setup_stream(layer);

	return (APEG_STREAM*)layer;
}
void VideoManager::unloadVideo()
{
	if ( cmov != NULL )
	{
		apeg_reset_stream(cmov);
		apeg_close_stream(cmov);
	}
	if ( videoBuffer != NULL )
	{
		free(videoBuffer);
	}
	videoBuffer = NULL;
	cmov = NULL;
}
Exemplo n.º 6
0
void play_theora_video(const char *name, int skip, int flags)
{
  apeg_set_display_depth(bitmap_color_depth(screen));
  // we must disable length detection, otherwise it takes ages to start
  // playing if the file is large because it seeks through the whole thing
  apeg_disable_length_detection(TRUE);
  apeg_enable_framedrop(TRUE);
  update_polled_stuff();

  stretch_flc = (flags % 10);
  canabort = skip;
  apeg_ignore_audio((flags >= 10) ? 1 : 0);

  int videoWidth, videoHeight;
  APEG_STREAM *oggVid = get_theora_size(name, &videoWidth, &videoHeight);

  if (videoWidth == 0)
  {
    Display("Unable to load theora video '%s'", name);
    return;
  }

  if (flags < 10)
  {
    stop_all_sound_and_music();
  }

  fli_target = NULL;
  //fli_buffer = create_bitmap_ex(final_col_dep, videoWidth, videoHeight);
  calculate_destination_size_maintain_aspect_ratio(videoWidth, videoHeight, &fliTargetWidth, &fliTargetHeight);

  if ((fliTargetWidth == videoWidth) && (fliTargetHeight == videoHeight) && (stretch_flc))
  {
    // don't need to stretch after all
    stretch_flc = 0;
  }

  if ((stretch_flc) && (!gfxDriver->HasAcceleratedStretchAndFlip()))
  {
    fli_target = create_bitmap_ex(final_col_dep, scrnwid, scrnhit);
    clear(fli_target);
    fli_ddb = gfxDriver->CreateDDBFromBitmap(fli_target, false, true);
  }
  else
  {
    fli_ddb = NULL;
  }

  update_polled_stuff();

  clear(virtual_screen);

  if (apeg_play_apeg_stream(oggVid, NULL, 0, theora_playing_callback) == APEG_ERROR)
  {
    Display("Error playing theora video '%s'", name);
  }
  apeg_close_stream(oggVid);

  //destroy_bitmap(fli_buffer);
  if (fli_target != NULL)
    destroy_bitmap(fli_target);
  gfxDriver->DestroyDDB(fli_ddb);
  fli_ddb = NULL;
  invalidate_screen();
}