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; }
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; }
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; }
// 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; }
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(); }