1
package org.xiph.foggy;
3
import org.xiph.system.Bytes;
5
import org.xiph.fogg.SyncState;
6
import org.xiph.fogg.StreamState;
7
import org.xiph.fogg.Page;
8
import org.xiph.fogg.Packet;
10
import flash.utils.IDataInput;
18
public static inline var ENOTOGG = -1;
21
//var os : StreamState;
25
var streams : IntHash<StreamState>;
28
var page_cbs : IntHash<Page -> Int -> DemuxerStatus>;
29
var packet_cbs : IntHash<Packet -> Int -> DemuxerStatus>;
31
public function new() {
32
page_cbs = new IntHash();
33
packet_cbs = new IntHash();
34
streams = new IntHash();
39
//os = new StreamState();
47
public function set_page_cb(serialno : Int,
48
cb : Page -> Int -> DemuxerStatus) : Void {
49
if (serialno != -1 && !streams.exists(serialno)) {
50
// TODO: throw and exception?
52
page_cbs.set(serialno, cb);
56
public function remove_page_cb(serialno : Int) : Void {
57
page_cbs.remove(serialno);
60
public function set_packet_cb(serialno : Int,
61
cb : Packet -> Int -> DemuxerStatus) : Void {
62
if (serialno != -1 && !streams.exists(serialno)) {
63
// TODO: throw and exception?
64
trace("*** HERE ***");
65
trace("streams: " + streams.toString());
67
packet_cbs.set(serialno, cb);
71
public function remove_packet_cb(serialno : Int) : Void {
72
packet_cbs.remove(serialno);
75
//public function read(data : Bytes, len : Int, pos : Int = -1) : Int {
76
public function read(data : IDataInput, len : Int, pos : Int = -1) : Int {
77
// TODO: handle len as end_of_data?
80
var index : Int = oy.buffer(len);
84
//data.position = pos;
86
data.readBytes(buffer, index, len);
90
if ((ret = oy.pageout(og)) != 1) {
91
if (buffer.length < 16384 || ret == 0)
99
// TODO: check for returns from _process_page()
105
private function _process_page(p : Page) : Int {
106
var sn = p.serialno();
107
var cbret : DemuxerStatus;
109
var cb : Page -> Int -> DemuxerStatus;
111
cb = page_cbs.get(sn);
113
cb = page_cbs.get(-1);
118
// TODO handle stop request
121
var os : StreamState = streams.get(sn);
124
// unexpected new stream
127
os = new StreamState();
131
// end of bos pages? handle!...
137
if (os.pagein(p) < 0) {
138
// can happen on an unsupported version
143
if ((ret = os.packetout(op)) != 1) {
147
_process_packet(op, sn);
154
if (!streams.iterator().hasNext()) {
156
// we're ready for new chained streams
163
private function _process_packet(p : Packet, sn : Int) : Int {
165
var cbret : DemuxerStatus;
166
var cb : Packet -> Int -> DemuxerStatus;
168
cb = packet_cbs.get(sn);
170
cb = packet_cbs.get(-1);
175
// TODO handle stop request
b'\\ No newline at end of file'