#include "dvd.h" static s32 dvd_stream_read(void *userdata, void *buffer, s32 size) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)userdata; return cch_handle_read(dvd->handle, (u8 *)buffer, size); } static s32 dvd_stream_seek(void *userdata, u64 pos) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)userdata; cch_handle_seek(dvd->handle, pos, SEEK_SET); return 0; } static dvdnav_stream_cb cb = { .pf_read = dvd_stream_read, .pf_seek = dvd_stream_seek }; #define DVD_LANGUAGE "en" static bool dvd_server_init(struct lia_server_handler *handler, struct cch_handle *handle) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)handler; dvd->handle = handle; dvd->dvdnav = NULL; dvdnav_open_stream2(&dvd->dvdnav, dvd, NULL, &cb); //if (dvdnav_set_readahead_flag(dvdnav, DVD_READ_CACHE) != DVDNAV_STATUS_OK) { // dvdnav_err_to_string(dvdnav)) //} if (dvdnav_menu_language_select(dvd->dvdnav, DVD_LANGUAGE) != DVDNAV_STATUS_OK || dvdnav_audio_language_select(dvd->dvdnav, DVD_LANGUAGE) != DVDNAV_STATUS_OK || dvdnav_spu_language_select(dvd->dvdnav, DVD_LANGUAGE) != DVDNAV_STATUS_OK) { } //if (dvdnav_set_PGC_positioning_flag(dvdnav, 1) != DVDNAV_STATUS_OK) { //} nn_buffer_init(&dvd->buffer); nn_buffer_ensure_space(&dvd->buffer, DVD_VIDEO_LB_LEN); return true; } static void dvd_server_write_info(struct lia_server_handler *handler, struct nn_packet *packet) { (void)handler; (void)packet; } static void dvd_server_subscribe(struct lia_server_handler *handler, u64 mask) { (void)handler; (void)mask; } static u64 dvd_server_get_duration(struct lia_server_handler *handler) { (void)handler; return 0; } static bool dvd_server_seek(struct lia_server_handler *handler, u64 pos) { (void)handler; (void)pos; return false; } static void dvd_server_step(struct lia_server_handler *handler) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)handler; s32 event, length; s32 ret = dvdnav_get_next_block(dvd->dvdnav, nn_buffer_get_ptr(&dvd->buffer, 0), &event, &length); if (ret == DVDNAV_STATUS_ERR) { return; } switch (event) { case DVDNAV_BLOCK_OK: break; case DVDNAV_NOP: break; case DVDNAV_STILL_FRAME: break; case DVDNAV_WAIT: break; case DVDNAV_SPU_CLUT_CHANGE: break; case DVDNAV_SPU_STREAM_CHANGE: break; case DVDNAV_AUDIO_STREAM_CHANGE: break; case DVDNAV_HIGHLIGHT: break; case DVDNAV_VTS_CHANGE: break; case DVDNAV_CELL_CHANGE: break; case DVDNAV_NAV_PACKET: break; case DVDNAV_HOP_CHANNEL: break; case DVDNAV_STOP: break; default: break; } } static void dvd_server_write_packet(struct lia_server_handler *handler, struct nn_packet *packet) { (void)handler; (void)packet; } static void dvd_server_free(struct lia_server_handler **handler) { struct lia_dvd_server *dvd = (struct lia_dvd_server *)*handler; al_free(dvd); *handler = NULL; } struct lia_server_handler *lia_dvd_server_create(void) { struct lia_dvd_server *dvd = al_alloc_object(struct lia_dvd_server); dvd->handler.init = dvd_server_init; dvd->handler.write_info = dvd_server_write_info; dvd->handler.subscribe = dvd_server_subscribe; dvd->handler.get_duration = dvd_server_get_duration; dvd->handler.seek = dvd_server_seek; dvd->handler.step = dvd_server_step; dvd->handler.write_packet = dvd_server_write_packet; dvd->handler.free = dvd_server_free; return (struct lia_server_handler *)dvd; }