...
This commit is contained in:
parent
bcecb67685
commit
3842a1a9ff
30
Makefile
30
Makefile
|
@ -1,5 +1,5 @@
|
||||||
#procs != nproc
|
procs != nproc
|
||||||
#MAKEFLAGS = --jobs=$(procs)
|
MAKEFLAGS = --jobs=$(procs)
|
||||||
|
|
||||||
UNAME != uname
|
UNAME != uname
|
||||||
|
|
||||||
|
@ -75,10 +75,14 @@ edirs += ./source/engine/thirdparty/Chipmunk2D/include ./source/engine/thirdpart
|
||||||
includeflag != $(call prefix,$(edirs) $(eddirs) $(pindirs) $(bsdirs),-I)
|
includeflag != $(call prefix,$(edirs) $(eddirs) $(pindirs) $(bsdirs),-I)
|
||||||
COMPINCLUDE = $(edirs) $(eddirs) $(pindirs) $(bsdirs)
|
COMPINCLUDE = $(edirs) $(eddirs) $(pindirs) $(bsdirs)
|
||||||
|
|
||||||
#COMPILER_FLAGS specifies the additional compilation options we're using
|
|
||||||
|
|
||||||
WARNING_FLAGS = -Wno-everything#-Wall -Wextra -Wwrite-strings -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-incompatible-function-pointer-types -Wno-gnu-statement-expression -Wno-complex-component-init -pedantic
|
WARNING_FLAGS = -Wno-everything#-Wall -Wextra -Wwrite-strings -Wno-unused-parameter -Wno-unused-function -Wno-missing-braces -Wno-incompatible-function-pointer-types -Wno-gnu-statement-expression -Wno-complex-component-init -pedantic
|
||||||
#COMPILER_FLAGS = $(includeflag) -g -O0 $(WARNING_FLAGS) -DGLEW_STATIC -D_GLFW_X11 -D_POSIX_C_SOURCE=1993809L -c -MMD -MP $< -o $@
|
|
||||||
COMPILER_FLAGS = $(includeflag) -I/usr/local/include -g -O0 $(WARNING_FLAGS) -DGLEW_STATIC -D_GLFW_X11 -D_POSIX_C_SOURCE=1993809L -c $< -o $@
|
|
||||||
|
|
||||||
|
COMPILER_FLAGS = $(includeflag) -I/usr/local/include -g -O0 $(WARNING_FLAGS) -MD -c $< -o $@
|
||||||
|
#-D_POSIX_C_SOURCE=1993809L
|
||||||
|
|
||||||
LIBPATH = -L./bin -L/usr/local/lib -L/usr/local/lib/tcc
|
LIBPATH = -L./bin -L/usr/local/lib -L/usr/local/lib/tcc
|
||||||
|
|
||||||
|
@ -89,8 +93,8 @@ ifeq ($(UNAME), Windows_NT)
|
||||||
CLIBS = glew32
|
CLIBS = glew32
|
||||||
EXT = .exe
|
EXT = .exe
|
||||||
else
|
else
|
||||||
LINKER_FLAGS = -fPIC -rdynamic
|
LINKER_FLAGS = -fuse-ld=lld #/usr/local/lib/tcc/bcheck.o /usr/local/lib/tcc/bt-exe.o /usr/local/lib/tcc/bt-log.o
|
||||||
ELIBS = m c engine editor glfw3
|
ELIBS = m c engine editor glfw3 tcc1
|
||||||
CLIBS =
|
CLIBS =
|
||||||
EXT =
|
EXT =
|
||||||
endif
|
endif
|
||||||
|
@ -117,22 +121,22 @@ LINK = $(LIBPATH) $(LINKER_FLAGS) $(LELIBS) -o $@
|
||||||
|
|
||||||
engine: $(yuginec:.%.c=$(objprefix)%.o) $(ENGINE)
|
engine: $(yuginec:.%.c=$(objprefix)%.o) $(ENGINE)
|
||||||
@echo Linking engine
|
@echo Linking engine
|
||||||
@$(CC) $^ $(LINK)
|
@$(CC) $@ $(LINK)
|
||||||
@echo Finished build
|
@echo Finished build
|
||||||
|
|
||||||
editor: $(yuginec:.%.c=$(objprefix)%.o) $(EDITOR) $(ENGINE)
|
editor: $(yuginec:.%.c=$(objprefix)%.o) $(EDITOR) $(ENGINE)
|
||||||
@echo Linking editor
|
@echo Linking editor
|
||||||
$(CC) $^ $(LINK)
|
@$(CC) $^ $(LINK)
|
||||||
@echo Finished build
|
@echo Finished build
|
||||||
|
|
||||||
$(ENGINE): $(eobjects) bin/libglfw3.a
|
$(ENGINE): $(eobjects) bin/libglfw3.a
|
||||||
@echo Making library engine.a
|
@echo Making library engine.a
|
||||||
@ar -r $(ENGINE) $^
|
@ar r $(ENGINE) $(eobjects)
|
||||||
@cp -u -r $(ehead) $(INCLUDE)
|
@cp -u -r $(ehead) $(INCLUDE)
|
||||||
|
|
||||||
$(EDITOR): $(edobjects)
|
$(EDITOR): $(edobjects)
|
||||||
@echo Making editor library
|
@echo Making editor library
|
||||||
@ar -r $(EDITOR) $^
|
@ar r $(EDITOR) $^
|
||||||
@cp -u -r $(edhead) $(INCLUDE)
|
@cp -u -r $(edhead) $(INCLUDE)
|
||||||
|
|
||||||
xbrainstorm: $(bsobjects) $(ENGINE) $(EDITOR)
|
xbrainstorm: $(bsobjects) $(ENGINE) $(EDITOR)
|
||||||
|
@ -147,8 +151,8 @@ pinball: $(ENGINE) $(pinobjects)
|
||||||
|
|
||||||
bin/libglfw3.a:
|
bin/libglfw3.a:
|
||||||
@echo Making GLFW
|
@echo Making GLFW
|
||||||
make glfw/build
|
@make glfw/build
|
||||||
cp glfw/build/src/libglfw3.a bin/libglfw3.a
|
@cp glfw/build/src/libglfw3.a bin/libglfw3.a
|
||||||
|
|
||||||
$(objprefix)/%.o:%.c
|
$(objprefix)/%.o:%.c
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
|
|
122
source/engine/thirdparty/pl_mpeg/pl_mpeg.c
vendored
122
source/engine/thirdparty/pl_mpeg/pl_mpeg.c
vendored
|
@ -139,7 +139,7 @@ int plm_has_headers(plm_t *self) {
|
||||||
if (!plm_demux_has_headers(self->demux)) {
|
if (!plm_demux_has_headers(self->demux)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!plm_init_decoders(self)) {
|
if (!plm_init_decoders(self)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -299,7 +299,7 @@ void plm_decode(plm_t *self, double tick) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
did_decode = FALSE;
|
did_decode = FALSE;
|
||||||
|
|
||||||
if (decode_video && plm_video_get_time(self->video_decoder) < video_target_time) {
|
if (decode_video && plm_video_get_time(self->video_decoder) < video_target_time) {
|
||||||
plm_frame_t *frame = plm_video_decode(self->video_decoder);
|
plm_frame_t *frame = plm_video_decode(self->video_decoder);
|
||||||
if (frame) {
|
if (frame) {
|
||||||
|
@ -322,10 +322,10 @@ void plm_decode(plm_t *self, double tick) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (did_decode);
|
} while (did_decode);
|
||||||
|
|
||||||
// Did all sources we wanted to decode fail and the demuxer is at the end?
|
// Did all sources we wanted to decode fail and the demuxer is at the end?
|
||||||
if (
|
if (
|
||||||
(!decode_video || decode_video_failed) &&
|
(!decode_video || decode_video_failed) &&
|
||||||
(!decode_audio || decode_audio_failed) &&
|
(!decode_audio || decode_audio_failed) &&
|
||||||
plm_demux_has_ended(self->demux)
|
plm_demux_has_ended(self->demux)
|
||||||
) {
|
) {
|
||||||
|
@ -440,7 +440,7 @@ plm_frame_t *plm_seek_frame(plm_t *self, double time, int seek_exact) {
|
||||||
else if (time > duration) {
|
else if (time > duration) {
|
||||||
time = duration;
|
time = duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
plm_packet_t *packet = plm_demux_seek(self->demux, time, type, TRUE);
|
plm_packet_t *packet = plm_demux_seek(self->demux, time, type, TRUE);
|
||||||
if (!packet) {
|
if (!packet) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -454,7 +454,7 @@ plm_frame_t *plm_seek_frame(plm_t *self, double time, int seek_exact) {
|
||||||
plm_video_rewind(self->video_decoder);
|
plm_video_rewind(self->video_decoder);
|
||||||
plm_video_set_time(self->video_decoder, packet->pts - start_time);
|
plm_video_set_time(self->video_decoder, packet->pts - start_time);
|
||||||
plm_buffer_write(self->video_buffer, packet->data, packet->length);
|
plm_buffer_write(self->video_buffer, packet->data, packet->length);
|
||||||
plm_frame_t *frame = plm_video_decode(self->video_decoder);
|
plm_frame_t *frame = plm_video_decode(self->video_decoder);
|
||||||
|
|
||||||
// If we want to seek to an exact frame, we have to decode all frames
|
// If we want to seek to an exact frame, we have to decode all frames
|
||||||
// on top of the intra frame we just jumped to.
|
// on top of the intra frame we just jumped to.
|
||||||
|
@ -477,13 +477,13 @@ plm_frame_t *plm_seek_frame(plm_t *self, double time, int seek_exact) {
|
||||||
|
|
||||||
int plm_seek(plm_t *self, double time, int seek_exact) {
|
int plm_seek(plm_t *self, double time, int seek_exact) {
|
||||||
plm_frame_t *frame = plm_seek_frame(self, time, seek_exact);
|
plm_frame_t *frame = plm_seek_frame(self, time, seek_exact);
|
||||||
|
|
||||||
if (!frame) {
|
if (!frame) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->video_decode_callback) {
|
if (self->video_decode_callback) {
|
||||||
self->video_decode_callback(self, frame, self->video_decode_callback_user_data);
|
self->video_decode_callback(self, frame, self->video_decode_callback_user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If audio is not enabled we are done here.
|
// If audio is not enabled we are done here.
|
||||||
|
@ -512,8 +512,8 @@ int plm_seek(plm_t *self, double time, int seek_exact) {
|
||||||
plm_decode(self, 0);
|
plm_decode(self, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,7 +586,7 @@ plm_buffer_t *plm_buffer_create_with_file(FILE *fh, int close_when_done) {
|
||||||
self->close_when_done = close_when_done;
|
self->close_when_done = close_when_done;
|
||||||
self->mode = PLM_BUFFER_MODE_FILE;
|
self->mode = PLM_BUFFER_MODE_FILE;
|
||||||
self->discard_read_bytes = TRUE;
|
self->discard_read_bytes = TRUE;
|
||||||
|
|
||||||
fseek(self->fh, 0, SEEK_END);
|
fseek(self->fh, 0, SEEK_END);
|
||||||
self->total_size = ftell(self->fh);
|
self->total_size = ftell(self->fh);
|
||||||
fseek(self->fh, 0, SEEK_SET);
|
fseek(self->fh, 0, SEEK_SET);
|
||||||
|
@ -652,8 +652,8 @@ size_t plm_buffer_write(plm_buffer_t *self, uint8_t *bytes, size_t length) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->discard_read_bytes) {
|
if (self->discard_read_bytes) {
|
||||||
// This should be a ring buffer, but instead it just shifts all unread
|
// This should be a ring buffer, but instead it just shifts all unread
|
||||||
// data to the beginning of the buffer and appends new data at the end.
|
// data to the beginning of the buffer and appends new data at the end.
|
||||||
// Seems to be good enough.
|
// Seems to be good enough.
|
||||||
|
|
||||||
plm_buffer_discard_read_bytes(self);
|
plm_buffer_discard_read_bytes(self);
|
||||||
|
@ -703,7 +703,7 @@ void plm_buffer_seek(plm_buffer_t *self, size_t pos) {
|
||||||
else if (self->mode == PLM_BUFFER_MODE_RING) {
|
else if (self->mode == PLM_BUFFER_MODE_RING) {
|
||||||
if (pos != 0) {
|
if (pos != 0) {
|
||||||
// Seeking to non-0 is forbidden for dynamic-mem buffers
|
// Seeking to non-0 is forbidden for dynamic-mem buffers
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
self->bit_index = 0;
|
self->bit_index = 0;
|
||||||
self->length = 0;
|
self->length = 0;
|
||||||
|
@ -735,7 +735,7 @@ void plm_buffer_discard_read_bytes(plm_buffer_t *self) {
|
||||||
|
|
||||||
void plm_buffer_load_file_callback(plm_buffer_t *self, void *user) {
|
void plm_buffer_load_file_callback(plm_buffer_t *self, void *user) {
|
||||||
PLM_UNUSED(user);
|
PLM_UNUSED(user);
|
||||||
|
|
||||||
if (self->discard_read_bytes) {
|
if (self->discard_read_bytes) {
|
||||||
plm_buffer_discard_read_bytes(self);
|
plm_buffer_discard_read_bytes(self);
|
||||||
}
|
}
|
||||||
|
@ -760,12 +760,12 @@ int plm_buffer_has(plm_buffer_t *self, size_t count) {
|
||||||
|
|
||||||
if (self->load_callback) {
|
if (self->load_callback) {
|
||||||
self->load_callback(self, self->load_callback_user_data);
|
self->load_callback(self, self->load_callback_user_data);
|
||||||
|
|
||||||
if (((self->length << 3) - self->bit_index) >= count) {
|
if (((self->length << 3) - self->bit_index) >= count) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->total_size != 0 && self->length == self->total_size) {
|
if (self->total_size != 0 && self->length == self->total_size) {
|
||||||
self->has_ended = TRUE;
|
self->has_ended = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -847,7 +847,7 @@ int plm_buffer_find_start_code(plm_buffer_t *self, int code) {
|
||||||
int plm_buffer_has_start_code(plm_buffer_t *self, int code) {
|
int plm_buffer_has_start_code(plm_buffer_t *self, int code) {
|
||||||
size_t previous_bit_index = self->bit_index;
|
size_t previous_bit_index = self->bit_index;
|
||||||
int previous_discard_read_bytes = self->discard_read_bytes;
|
int previous_discard_read_bytes = self->discard_read_bytes;
|
||||||
|
|
||||||
self->discard_read_bytes = FALSE;
|
self->discard_read_bytes = FALSE;
|
||||||
int current = plm_buffer_find_start_code(self, code);
|
int current = plm_buffer_find_start_code(self, code);
|
||||||
|
|
||||||
|
@ -1033,7 +1033,7 @@ double plm_demux_get_start_time(plm_demux_t *self, int type) {
|
||||||
|
|
||||||
int previous_pos = plm_buffer_tell(self->buffer);
|
int previous_pos = plm_buffer_tell(self->buffer);
|
||||||
int previous_start_code = self->start_code;
|
int previous_start_code = self->start_code;
|
||||||
|
|
||||||
// Find first video PTS
|
// Find first video PTS
|
||||||
plm_demux_rewind(self);
|
plm_demux_rewind(self);
|
||||||
do {
|
do {
|
||||||
|
@ -1063,8 +1063,8 @@ double plm_demux_get_duration(plm_demux_t *self, int type) {
|
||||||
|
|
||||||
size_t previous_pos = plm_buffer_tell(self->buffer);
|
size_t previous_pos = plm_buffer_tell(self->buffer);
|
||||||
int previous_start_code = self->start_code;
|
int previous_start_code = self->start_code;
|
||||||
|
|
||||||
// Find last video PTS. Start searching 64kb from the end and go further
|
// Find last video PTS. Start searching 64kb from the end and go further
|
||||||
// back if needed.
|
// back if needed.
|
||||||
long start_range = 64 * 1024;
|
long start_range = 64 * 1024;
|
||||||
long max_range = 4096 * 1024;
|
long max_range = 4096 * 1024;
|
||||||
|
@ -1103,7 +1103,7 @@ plm_packet_t *plm_demux_seek(plm_demux_t *self, double seek_time, int type, int
|
||||||
|
|
||||||
// Using the current time, current byte position and the average bytes per
|
// Using the current time, current byte position and the average bytes per
|
||||||
// second for this file, try to jump to a byte position that hopefully has
|
// second for this file, try to jump to a byte position that hopefully has
|
||||||
// packets containing timestamps within one second before to the desired
|
// packets containing timestamps within one second before to the desired
|
||||||
// seek_time.
|
// seek_time.
|
||||||
|
|
||||||
// If we hit close to the seek_time scan through all packets to find the
|
// If we hit close to the seek_time scan through all packets to find the
|
||||||
|
@ -1112,7 +1112,7 @@ plm_packet_t *plm_demux_seek(plm_demux_t *self, double seek_time, int type, int
|
||||||
// per second for the jumped range and jump again.
|
// per second for the jumped range and jump again.
|
||||||
|
|
||||||
// The number of retries here is hard-limited to a generous amount. Usually
|
// The number of retries here is hard-limited to a generous amount. Usually
|
||||||
// the correct range is found after 1--5 jumps, even for files with very
|
// the correct range is found after 1--5 jumps, even for files with very
|
||||||
// variable bitrates. If significantly more jumps are needed, there's
|
// variable bitrates. If significantly more jumps are needed, there's
|
||||||
// probably something wrong with the file and we just avoid getting into an
|
// probably something wrong with the file and we just avoid getting into an
|
||||||
// infinite loop. 32 retries should be enough for anybody.
|
// infinite loop. 32 retries should be enough for anybody.
|
||||||
|
@ -1165,7 +1165,7 @@ plm_packet_t *plm_demux_seek(plm_demux_t *self, double seek_time, int type, int
|
||||||
|
|
||||||
// Bail scanning through packets if we hit one that is outside
|
// Bail scanning through packets if we hit one that is outside
|
||||||
// seek_time - scan_span.
|
// seek_time - scan_span.
|
||||||
// We also adjust the cur_time and byterate values here so the next
|
// We also adjust the cur_time and byterate values here so the next
|
||||||
// iteration can be a bit more precise.
|
// iteration can be a bit more precise.
|
||||||
if (packet->pts > seek_time || packet->pts < seek_time - scan_span) {
|
if (packet->pts > seek_time || packet->pts < seek_time - scan_span) {
|
||||||
found_packet_with_pts = TRUE;
|
found_packet_with_pts = TRUE;
|
||||||
|
@ -1185,7 +1185,7 @@ plm_packet_t *plm_demux_seek(plm_demux_t *self, double seek_time, int type, int
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if this is an intra frame packet. If so, record the buffer
|
// Check if this is an intra frame packet. If so, record the buffer
|
||||||
// position of the start of this packet. We want to jump back to it
|
// position of the start of this packet. We want to jump back to it
|
||||||
// later, when we know it's the last intra frame before desired
|
// later, when we know it's the last intra frame before desired
|
||||||
// seek time.
|
// seek time.
|
||||||
if (force_intra) {
|
if (force_intra) {
|
||||||
|
@ -1197,7 +1197,7 @@ plm_packet_t *plm_demux_seek(plm_demux_t *self, double seek_time, int type, int
|
||||||
packet->data[i + 2] == 0x01 &&
|
packet->data[i + 2] == 0x01 &&
|
||||||
packet->data[i + 3] == 0x00
|
packet->data[i + 3] == 0x00
|
||||||
) {
|
) {
|
||||||
// Bits 11--13 in the picture header contain the frame
|
// Bits 11--13 in the picture header contain the frame
|
||||||
// type, where 1=Intra
|
// type, where 1=Intra
|
||||||
if ((packet->data[i + 5] & 0x38) == 8) {
|
if ((packet->data[i + 5] & 0x38) == 8) {
|
||||||
last_valid_packet_start = packet_start;
|
last_valid_packet_start = packet_start;
|
||||||
|
@ -1266,9 +1266,9 @@ plm_packet_t *plm_demux_decode(plm_demux_t *self) {
|
||||||
do {
|
do {
|
||||||
self->start_code = plm_buffer_next_start_code(self->buffer);
|
self->start_code = plm_buffer_next_start_code(self->buffer);
|
||||||
if (
|
if (
|
||||||
self->start_code == PLM_DEMUX_PACKET_VIDEO_1 ||
|
self->start_code == PLM_DEMUX_PACKET_VIDEO_1 ||
|
||||||
self->start_code == PLM_DEMUX_PACKET_PRIVATE || (
|
self->start_code == PLM_DEMUX_PACKET_PRIVATE || (
|
||||||
self->start_code >= PLM_DEMUX_PACKET_AUDIO_1 &&
|
self->start_code >= PLM_DEMUX_PACKET_AUDIO_1 &&
|
||||||
self->start_code <= PLM_DEMUX_PACKET_AUDIO_4
|
self->start_code <= PLM_DEMUX_PACKET_AUDIO_4
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
@ -1326,7 +1326,7 @@ plm_packet_t *plm_demux_decode_packet(plm_demux_t *self, int type) {
|
||||||
else {
|
else {
|
||||||
return NULL; // invalid
|
return NULL; // invalid
|
||||||
}
|
}
|
||||||
|
|
||||||
return plm_demux_get_packet(self);
|
return plm_demux_get_packet(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1349,7 +1349,7 @@ plm_packet_t *plm_demux_get_packet(plm_demux_t *self) {
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// plm_video implementation
|
// plm_video implementation
|
||||||
|
|
||||||
// Inspired by Java MPEG-1 Video Decoder and Player by Zoltan Korandi
|
// Inspired by Java MPEG-1 Video Decoder and Player by Zoltan Korandi
|
||||||
// https://sourceforge.net/projects/javampeg1video/
|
// https://sourceforge.net/projects/javampeg1video/
|
||||||
|
|
||||||
static const int PLM_VIDEO_PICTURE_TYPE_INTRA = 1;
|
static const int PLM_VIDEO_PICTURE_TYPE_INTRA = 1;
|
||||||
|
@ -1837,7 +1837,7 @@ void plm_video_idct(int *block);
|
||||||
plm_video_t * plm_video_create_with_buffer(plm_buffer_t *buffer, int destroy_when_done) {
|
plm_video_t * plm_video_create_with_buffer(plm_buffer_t *buffer, int destroy_when_done) {
|
||||||
plm_video_t *self = (plm_video_t *)malloc(sizeof(plm_video_t));
|
plm_video_t *self = (plm_video_t *)malloc(sizeof(plm_video_t));
|
||||||
memset(self, 0, sizeof(plm_video_t));
|
memset(self, 0, sizeof(plm_video_t));
|
||||||
|
|
||||||
self->buffer = buffer;
|
self->buffer = buffer;
|
||||||
self->destroy_buffer_when_done = destroy_when_done;
|
self->destroy_buffer_when_done = destroy_when_done;
|
||||||
|
|
||||||
|
@ -1908,12 +1908,12 @@ plm_frame_t *plm_video_decode(plm_video_t *self) {
|
||||||
if (!plm_video_has_header(self)) {
|
if (!plm_video_has_header(self)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
plm_frame_t *frame = NULL;
|
plm_frame_t *frame = NULL;
|
||||||
do {
|
do {
|
||||||
if (self->start_code != PLM_START_PICTURE) {
|
if (self->start_code != PLM_START_PICTURE) {
|
||||||
self->start_code = plm_buffer_find_start_code(self->buffer, PLM_START_PICTURE);
|
self->start_code = plm_buffer_find_start_code(self->buffer, PLM_START_PICTURE);
|
||||||
|
|
||||||
if (self->start_code == -1) {
|
if (self->start_code == -1) {
|
||||||
// If we reached the end of the file and the previously decoded
|
// If we reached the end of the file and the previously decoded
|
||||||
// frame was a reference frame, we still have to return it.
|
// frame was a reference frame, we still have to return it.
|
||||||
|
@ -1946,7 +1946,7 @@ plm_frame_t *plm_video_decode(plm_video_t *self) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
plm_buffer_discard_read_bytes(self->buffer);
|
plm_buffer_discard_read_bytes(self->buffer);
|
||||||
|
|
||||||
plm_video_decode_picture(self);
|
plm_video_decode_picture(self);
|
||||||
|
|
||||||
if (self->assume_no_b_frames) {
|
if (self->assume_no_b_frames) {
|
||||||
|
@ -1962,11 +1962,11 @@ plm_frame_t *plm_video_decode(plm_video_t *self) {
|
||||||
self->has_reference_frame = TRUE;
|
self->has_reference_frame = TRUE;
|
||||||
}
|
}
|
||||||
} while (!frame);
|
} while (!frame);
|
||||||
|
|
||||||
frame->time = self->time;
|
frame->time = self->time;
|
||||||
self->frames_decoded++;
|
self->frames_decoded++;
|
||||||
self->time = (double)self->frames_decoded / self->framerate;
|
self->time = (double)self->frames_decoded / self->framerate;
|
||||||
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1981,7 +1981,7 @@ int plm_video_has_header(plm_video_t *self) {
|
||||||
if (self->start_code == -1) {
|
if (self->start_code == -1) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!plm_video_decode_sequence_header(self)) {
|
if (!plm_video_decode_sequence_header(self)) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -2011,7 +2011,7 @@ int plm_video_decode_sequence_header(plm_video_t *self) {
|
||||||
plm_buffer_skip(self->buffer, 18 + 1 + 10 + 1);
|
plm_buffer_skip(self->buffer, 18 + 1 + 10 + 1);
|
||||||
|
|
||||||
// Load custom intra quant matrix?
|
// Load custom intra quant matrix?
|
||||||
if (plm_buffer_read(self->buffer, 1)) {
|
if (plm_buffer_read(self->buffer, 1)) {
|
||||||
for (int i = 0; i < 64; i++) {
|
for (int i = 0; i < 64; i++) {
|
||||||
int idx = PLM_VIDEO_ZIG_ZAG[i];
|
int idx = PLM_VIDEO_ZIG_ZAG[i];
|
||||||
self->intra_quant_matrix[idx] = plm_buffer_read(self->buffer, 8);
|
self->intra_quant_matrix[idx] = plm_buffer_read(self->buffer, 8);
|
||||||
|
@ -2022,7 +2022,7 @@ int plm_video_decode_sequence_header(plm_video_t *self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load custom non intra quant matrix?
|
// Load custom non intra quant matrix?
|
||||||
if (plm_buffer_read(self->buffer, 1)) {
|
if (plm_buffer_read(self->buffer, 1)) {
|
||||||
for (int i = 0; i < 64; i++) {
|
for (int i = 0; i < 64; i++) {
|
||||||
int idx = PLM_VIDEO_ZIG_ZAG[i];
|
int idx = PLM_VIDEO_ZIG_ZAG[i];
|
||||||
self->non_intra_quant_matrix[idx] = plm_buffer_read(self->buffer, 8);
|
self->non_intra_quant_matrix[idx] = plm_buffer_read(self->buffer, 8);
|
||||||
|
@ -2124,7 +2124,7 @@ void plm_video_decode_picture(plm_video_t *self) {
|
||||||
do {
|
do {
|
||||||
self->start_code = plm_buffer_next_start_code(self->buffer);
|
self->start_code = plm_buffer_next_start_code(self->buffer);
|
||||||
} while (
|
} while (
|
||||||
self->start_code == PLM_START_EXTENSION ||
|
self->start_code == PLM_START_EXTENSION ||
|
||||||
self->start_code == PLM_START_USER_DATA
|
self->start_code == PLM_START_USER_DATA
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -2394,7 +2394,7 @@ void plm_video_process_macroblock(
|
||||||
|
|
||||||
unsigned int si = ((self->mb_row * block_size) + vp) * dw + (self->mb_col * block_size) + hp;
|
unsigned int si = ((self->mb_row * block_size) + vp) * dw + (self->mb_col * block_size) + hp;
|
||||||
unsigned int di = (self->mb_row * dw + self->mb_col) * block_size;
|
unsigned int di = (self->mb_row * dw + self->mb_col) * block_size;
|
||||||
|
|
||||||
unsigned int max_address = (dw * (self->mb_height * block_size - block_size + 1) - block_size);
|
unsigned int max_address = (dw * (self->mb_height * block_size - block_size + 1) - block_size);
|
||||||
if (si > max_address || di > max_address) {
|
if (si > max_address || di > max_address) {
|
||||||
return; // corrupt video
|
return; // corrupt video
|
||||||
|
@ -2823,10 +2823,10 @@ static const uint8_t PLM_AUDIO_QUANT_LUT_STEP_1[2][16] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Quantizer lookup, step 2: bitrate class, sample rate -> B2 table idx, sblimit
|
// Quantizer lookup, step 2: bitrate class, sample rate -> B2 table idx, sblimit
|
||||||
static const uint8_t PLM_AUDIO_QUANT_TAB_A = (27 | 64); // Table 3-B.2a: high-rate, sblimit = 27
|
#define PLM_AUDIO_QUANT_TAB_A (27 | 64) // Table 3-B.2a: high-rate, sblimit = 27
|
||||||
static const uint8_t PLM_AUDIO_QUANT_TAB_B = (30 | 64); // Table 3-B.2b: high-rate, sblimit = 30
|
#define PLM_AUDIO_QUANT_TAB_B (30 | 64) // Table 3-B.2b: high-rate, sblimit = 30
|
||||||
static const uint8_t PLM_AUDIO_QUANT_TAB_C = 8; // Table 3-B.2c: low-rate, sblimit = 8
|
#define PLM_AUDIO_QUANT_TAB_C 8 // Table 3-B.2c: low-rate, sblimit = 8
|
||||||
static const uint8_t PLM_AUDIO_QUANT_TAB_D = 12; // Table 3-B.2d: low-rate, sblimit = 12
|
#define PLM_AUDIO_QUANT_TAB_D 12 // Table 3-B.2d: low-rate, sblimit = 12
|
||||||
|
|
||||||
static const uint8_t QUANT_LUT_STEP_2[3][3] = {
|
static const uint8_t QUANT_LUT_STEP_2[3][3] = {
|
||||||
//44.1 kHz, 48 kHz, 32 kHz
|
//44.1 kHz, 48 kHz, 32 kHz
|
||||||
|
@ -2907,7 +2907,7 @@ typedef struct plm_audio_t {
|
||||||
int v_pos;
|
int v_pos;
|
||||||
int next_frame_data_size;
|
int next_frame_data_size;
|
||||||
int has_header;
|
int has_header;
|
||||||
|
|
||||||
plm_buffer_t *buffer;
|
plm_buffer_t *buffer;
|
||||||
int destroy_buffer_when_done;
|
int destroy_buffer_when_done;
|
||||||
|
|
||||||
|
@ -2926,7 +2926,7 @@ int plm_audio_find_frame_sync(plm_audio_t *self);
|
||||||
int plm_audio_decode_header(plm_audio_t *self);
|
int plm_audio_decode_header(plm_audio_t *self);
|
||||||
void plm_audio_decode_frame(plm_audio_t *self);
|
void plm_audio_decode_frame(plm_audio_t *self);
|
||||||
const plm_quantizer_spec_t *plm_audio_read_allocation(plm_audio_t *self, int sb, int tab3);
|
const plm_quantizer_spec_t *plm_audio_read_allocation(plm_audio_t *self, int sb, int tab3);
|
||||||
void plm_audio_read_samples(plm_audio_t *self, int ch, int sb, int part);
|
void plm_audio_read_samples(plm_audio_t *self, int ch, int sb, int part);
|
||||||
void plm_audio_idct36(int s[32][3], int ss, float *d, int dp);
|
void plm_audio_idct36(int s[32][3], int ss, float *d, int dp);
|
||||||
|
|
||||||
plm_audio_t *plm_audio_create_with_buffer(plm_buffer_t *buffer, int destroy_when_done) {
|
plm_audio_t *plm_audio_create_with_buffer(plm_buffer_t *buffer, int destroy_when_done) {
|
||||||
|
@ -2958,7 +2958,7 @@ int plm_audio_has_header(plm_audio_t *self) {
|
||||||
if (self->has_header) {
|
if (self->has_header) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->next_frame_data_size = plm_audio_decode_header(self);
|
self->next_frame_data_size = plm_audio_decode_header(self);
|
||||||
return self->has_header;
|
return self->has_header;
|
||||||
}
|
}
|
||||||
|
@ -2974,7 +2974,7 @@ double plm_audio_get_time(plm_audio_t *self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void plm_audio_set_time(plm_audio_t *self, double time) {
|
void plm_audio_set_time(plm_audio_t *self, double time) {
|
||||||
self->samples_decoded = time *
|
self->samples_decoded = time *
|
||||||
(double)PLM_AUDIO_SAMPLE_RATE[self->samplerate_index];
|
(double)PLM_AUDIO_SAMPLE_RATE[self->samplerate_index];
|
||||||
self->time = time;
|
self->time = time;
|
||||||
}
|
}
|
||||||
|
@ -3008,13 +3008,13 @@ plm_samples_t *plm_audio_decode(plm_audio_t *self) {
|
||||||
|
|
||||||
plm_audio_decode_frame(self);
|
plm_audio_decode_frame(self);
|
||||||
self->next_frame_data_size = 0;
|
self->next_frame_data_size = 0;
|
||||||
|
|
||||||
self->samples.time = self->time;
|
self->samples.time = self->time;
|
||||||
|
|
||||||
self->samples_decoded += PLM_AUDIO_SAMPLES_PER_FRAME;
|
self->samples_decoded += PLM_AUDIO_SAMPLES_PER_FRAME;
|
||||||
self->time = (double)self->samples_decoded /
|
self->time = (double)self->samples_decoded /
|
||||||
(double)PLM_AUDIO_SAMPLE_RATE[self->samplerate_index];
|
(double)PLM_AUDIO_SAMPLE_RATE[self->samplerate_index];
|
||||||
|
|
||||||
return &self->samples;
|
return &self->samples;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3042,10 +3042,10 @@ int plm_audio_decode_header(plm_audio_t *self) {
|
||||||
int sync = plm_buffer_read(self->buffer, 11);
|
int sync = plm_buffer_read(self->buffer, 11);
|
||||||
|
|
||||||
|
|
||||||
// Attempt to resync if no syncword was found. This sucks balls. The MP2
|
// Attempt to resync if no syncword was found. This sucks balls. The MP2
|
||||||
// stream contains a syncword just before every frame (11 bits set to 1).
|
// stream contains a syncword just before every frame (11 bits set to 1).
|
||||||
// However, this syncword is not guaranteed to not occur elsewhere in the
|
// However, this syncword is not guaranteed to not occur elsewhere in the
|
||||||
// stream. So, if we have to resync, we also have to check if the header
|
// stream. So, if we have to resync, we also have to check if the header
|
||||||
// (samplerate, bitrate) differs from the one we had before. This all
|
// (samplerate, bitrate) differs from the one we had before. This all
|
||||||
// may still lead to garbage data being decoded :/
|
// may still lead to garbage data being decoded :/
|
||||||
|
|
||||||
|
@ -3122,7 +3122,7 @@ void plm_audio_decode_frame(plm_audio_t *self) {
|
||||||
// Prepare the quantizer table lookups
|
// Prepare the quantizer table lookups
|
||||||
int tab3 = 0;
|
int tab3 = 0;
|
||||||
int sblimit = 0;
|
int sblimit = 0;
|
||||||
|
|
||||||
int tab1 = (self->mode == PLM_AUDIO_MODE_MONO) ? 0 : 1;
|
int tab1 = (self->mode == PLM_AUDIO_MODE_MONO) ? 0 : 1;
|
||||||
int tab2 = PLM_AUDIO_QUANT_LUT_STEP_1[tab1][self->bitrate_index];
|
int tab2 = PLM_AUDIO_QUANT_LUT_STEP_1[tab1][self->bitrate_index];
|
||||||
tab3 = QUANT_LUT_STEP_2[tab2][self->samplerate_index];
|
tab3 = QUANT_LUT_STEP_2[tab2][self->samplerate_index];
|
||||||
|
@ -3170,18 +3170,18 @@ void plm_audio_decode_frame(plm_audio_t *self) {
|
||||||
sf[2] = plm_buffer_read(self->buffer, 6);
|
sf[2] = plm_buffer_read(self->buffer, 6);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
sf[0] =
|
sf[0] =
|
||||||
sf[1] = plm_buffer_read(self->buffer, 6);
|
sf[1] = plm_buffer_read(self->buffer, 6);
|
||||||
sf[2] = plm_buffer_read(self->buffer, 6);
|
sf[2] = plm_buffer_read(self->buffer, 6);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
sf[0] =
|
sf[0] =
|
||||||
sf[1] =
|
sf[1] =
|
||||||
sf[2] = plm_buffer_read(self->buffer, 6);
|
sf[2] = plm_buffer_read(self->buffer, 6);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
sf[0] = plm_buffer_read(self->buffer, 6);
|
sf[0] = plm_buffer_read(self->buffer, 6);
|
||||||
sf[1] =
|
sf[1] =
|
||||||
sf[2] = plm_buffer_read(self->buffer, 6);
|
sf[2] = plm_buffer_read(self->buffer, 6);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3262,7 +3262,7 @@ void plm_audio_decode_frame(plm_audio_t *self) {
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (int j = 0; j < 32; j++) {
|
for (int j = 0; j < 32; j++) {
|
||||||
self->samples.interleaved[((out_pos + j) << 1) + ch] =
|
self->samples.interleaved[((out_pos + j) << 1) + ch] =
|
||||||
self->U[j] / 2147418112.0f;
|
self->U[j] / 2147418112.0f;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue