summaryrefslogtreecommitdiff
path: root/src/liana/handlers/dvd_server.c
blob: 5a9c793279fb68ee01e0a37619dc35dd6e9ad077 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#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, u32 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;
}