mirror of https://github.com/mpv-player/mpv
stage#1 completed: c files no more included from mplayer.c
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@588 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
4ebd355ec3
commit
b1b6b1fafa
4
Makefile
4
Makefile
|
@ -20,8 +20,8 @@ PRG_CFG = codec-cfg
|
|||
prefix = /usr/local
|
||||
BINDIR = ${prefix}/bin
|
||||
# BINDIR = /usr/local/bin
|
||||
SRCS = stream.c codec-cfg.c subreader.c linux/getch2.c linux/timer-lx.c linux/shmem.c xa/xa_gsm.c lirc_mp.c cfgparser.c mixer.c dvdauth.c spudec.c
|
||||
OBJS = stream.o codec-cfg.o subreader.o linux/getch2.o linux/timer-lx.o linux/shmem.o xa/xa_gsm.o lirc_mp.o cfgparser.o mixer.o dvdauth.o spudec.o
|
||||
SRCS = find_sub.c aviprint.c dll_init.c dec_audio.c aviwrite.c aviheader.c asfheader.c demux_avi.c demux_asf.c demux_mpg.c demuxer.c stream.c codec-cfg.c subreader.c linux/getch2.c linux/timer-lx.c linux/shmem.c xa/xa_gsm.c lirc_mp.c cfgparser.c mixer.c dvdauth.c spudec.c
|
||||
OBJS = find_sub.o aviprint.o dll_init.o dec_audio.o aviwrite.o aviheader.o asfheader.o demux_avi.o demux_asf.o demux_mpg.o demuxer.o stream.o codec-cfg.o subreader.o linux/getch2.o linux/timer-lx.o linux/shmem.o xa/xa_gsm.o lirc_mp.o cfgparser.o mixer.o dvdauth.o spudec.o
|
||||
CFLAGS = $(OPTFLAGS) $(CSS_INC) -Iloader -Ilibvo # -Wall
|
||||
A_LIBS = -Lmp3lib -lMP3 -Llibac3 -lac3
|
||||
VO_LIBS = -Llibvo -lvo $(X_LIBS)
|
||||
|
|
62
asfheader.c
62
asfheader.c
|
@ -1,5 +1,21 @@
|
|||
// .asf fileformat docs from http://divx.euro.ru
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "wine/mmreg.h"
|
||||
#include "wine/avifmt.h"
|
||||
#include "wine/vfw.h"
|
||||
|
||||
#include "codec-cfg.h"
|
||||
#include "stheader.h"
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
unsigned char guid[16];
|
||||
unsigned long long size;
|
||||
|
@ -38,38 +54,21 @@ typedef struct __attribute__((packed)) {
|
|||
} ASF_stream_header_t;
|
||||
|
||||
|
||||
ASF_header_t asfh;
|
||||
ASF_obj_header_t objh;
|
||||
ASF_file_header_t fileh;
|
||||
ASF_stream_header_t streamh;
|
||||
static ASF_header_t asfh;
|
||||
static ASF_obj_header_t objh;
|
||||
static ASF_file_header_t fileh;
|
||||
static ASF_stream_header_t streamh;
|
||||
|
||||
unsigned char* asf_packet=NULL;
|
||||
//int asf_video_id=-1;
|
||||
int asf_scrambling_h=1;
|
||||
int asf_scrambling_w=1;
|
||||
int asf_scrambling_b=1;
|
||||
int asf_packetsize=0;
|
||||
|
||||
int i;
|
||||
//int i;
|
||||
|
||||
void asf_descrambling(unsigned char *src,int len){
|
||||
unsigned char *dst=malloc(len);
|
||||
unsigned char *s2=src;
|
||||
int i=0,x,y;
|
||||
while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
|
||||
// printf("descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
|
||||
//i+=asf_scrambling_h*asf_scrambling_w;
|
||||
for(x=0;x<asf_scrambling_w;x++)
|
||||
for(y=0;y<asf_scrambling_h;y++){
|
||||
memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
|
||||
i+=asf_scrambling_b;
|
||||
}
|
||||
s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b;
|
||||
}
|
||||
//if(i<len) memcpy(dst+i,src+i,len-i);
|
||||
memcpy(src,dst,i);
|
||||
free(dst);
|
||||
}
|
||||
|
||||
char* asf_chunk_type(unsigned char* guid){
|
||||
static char* asf_chunk_type(unsigned char* guid){
|
||||
switch(*((unsigned int*)guid)){
|
||||
case 0xF8699E40: return "guid_audio_stream";
|
||||
case 0xBC19EFC0: return "guid_video_stream";
|
||||
|
@ -85,7 +84,7 @@ char* asf_chunk_type(unsigned char* guid){
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int asf_check_header(){
|
||||
int asf_check_header(demuxer_t *demuxer){
|
||||
unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
|
||||
stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj
|
||||
// for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n");
|
||||
|
@ -101,7 +100,7 @@ int asf_check_header(){
|
|||
return 1;
|
||||
}
|
||||
|
||||
int read_asf_header(){
|
||||
int read_asf_header(demuxer_t *demuxer){
|
||||
unsigned char buffer[512];
|
||||
|
||||
#if 1
|
||||
|
@ -166,12 +165,13 @@ if(verbose){
|
|||
case 0x8CABDCA1: // guid_file_header
|
||||
stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh));
|
||||
if(verbose) printf("ASF: packets: %d flags: %d pack_size: %d frame_size: %d\n",(int)fileh.packets,(int)fileh.flags,(int)fileh.packetsize,(int)fileh.frame_size);
|
||||
asf_packet=malloc(fileh.packetsize); // !!!
|
||||
asf_packetsize=fileh.packetsize;
|
||||
asf_packet=malloc(asf_packetsize); // !!!
|
||||
break;
|
||||
case 0x75b22636: // guid_data_chunk
|
||||
avi_header.movi_start=stream_tell(demuxer->stream)+26;
|
||||
avi_header.movi_end=endpos;
|
||||
if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",avi_header.movi_start,avi_header.movi_end);
|
||||
demuxer->movi_start=stream_tell(demuxer->stream)+26;
|
||||
demuxer->movi_end=endpos;
|
||||
if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end);
|
||||
break;
|
||||
|
||||
// case 0x33000890: return "guid_index_chunk";
|
||||
|
|
72
aviheader.c
72
aviheader.c
|
@ -1,7 +1,25 @@
|
|||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "wine/mmreg.h"
|
||||
#include "wine/avifmt.h"
|
||||
#include "wine/vfw.h"
|
||||
|
||||
#include "codec-cfg.h"
|
||||
#include "stheader.h"
|
||||
|
||||
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||
|
||||
void read_avi_header(int index_mode){
|
||||
static MainAVIHeader avih;
|
||||
|
||||
void read_avi_header(demuxer_t *demuxer,int index_mode){
|
||||
sh_audio_t *sh_audio=NULL;
|
||||
sh_video_t *sh_video=NULL;
|
||||
int stream_id=-1;
|
||||
|
@ -9,7 +27,7 @@ int idxfix_videostream=0;
|
|||
int idxfix_divx=0;
|
||||
|
||||
//---- AVI header:
|
||||
avi_header.idx_size=0;
|
||||
demuxer->idx_size=0;
|
||||
while(1){
|
||||
int id=stream_read_dword_le(demuxer->stream);
|
||||
int chunksize,size2;
|
||||
|
@ -23,9 +41,9 @@ while(1){
|
|||
if(verbose>=2) printf("LIST %.4s len=%d\n",&id,len);
|
||||
if(id==listtypeAVIMOVIE){
|
||||
// found MOVI header
|
||||
avi_header.movi_start=stream_tell(demuxer->stream);
|
||||
avi_header.movi_end=avi_header.movi_start+len;
|
||||
if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",avi_header.movi_start,avi_header.movi_end);
|
||||
demuxer->movi_start=stream_tell(demuxer->stream);
|
||||
demuxer->movi_end=demuxer->movi_start+len;
|
||||
if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end);
|
||||
len=(len+1)&(~1);
|
||||
stream_skip(demuxer->stream,len);
|
||||
}
|
||||
|
@ -36,9 +54,9 @@ while(1){
|
|||
chunksize=(size2+1)&(~1);
|
||||
switch(id){
|
||||
case ckidAVIMAINHDR: // read 'avih'
|
||||
stream_read(demuxer->stream,(char*) &avi_header.avih,MIN(size2,sizeof(avi_header.avih)));
|
||||
chunksize-=MIN(size2,sizeof(avi_header.avih));
|
||||
if(verbose) print_avih(&avi_header.avih);
|
||||
stream_read(demuxer->stream,(char*) &avih,MIN(size2,sizeof(avih)));
|
||||
chunksize-=MIN(size2,sizeof(avih));
|
||||
if(verbose) print_avih(&avih);
|
||||
break;
|
||||
case ckidSTREAMHEADER: { // read 'strh'
|
||||
AVIStreamHeader h;
|
||||
|
@ -79,6 +97,8 @@ while(1){
|
|||
case mmioFOURCC('d', 'i', 'v', '6'):
|
||||
case mmioFOURCC('M', 'P', '4', '3'):
|
||||
case mmioFOURCC('m', 'p', '4', '3'):
|
||||
case mmioFOURCC('M', 'P', '4', '2'):
|
||||
case mmioFOURCC('m', 'p', '4', '2'):
|
||||
case mmioFOURCC('A', 'P', '4', '1'):
|
||||
idxfix_divx=1; // we can fix keyframes only for divx coded files!
|
||||
}
|
||||
|
@ -95,13 +115,13 @@ while(1){
|
|||
break;
|
||||
}
|
||||
case ckidAVINEWINDEX: if(index_mode){
|
||||
avi_header.idx_size=size2>>4;
|
||||
demuxer->idx_size=size2>>4;
|
||||
if(verbose>=1) printf("Reading INDEX block, %d chunks for %d frames\n",
|
||||
avi_header.idx_size,avi_header.avih.dwTotalFrames);
|
||||
avi_header.idx=malloc(avi_header.idx_size<<4);
|
||||
stream_read(demuxer->stream,(char*)avi_header.idx,avi_header.idx_size<<4);
|
||||
chunksize-=avi_header.idx_size<<4;
|
||||
if(verbose>=2) print_index();
|
||||
demuxer->idx_size,avih.dwTotalFrames);
|
||||
demuxer->idx=malloc(demuxer->idx_size<<4);
|
||||
stream_read(demuxer->stream,(char*)demuxer->idx,demuxer->idx_size<<4);
|
||||
chunksize-=demuxer->idx_size<<4;
|
||||
if(verbose>=2) print_index(demuxer->idx,demuxer->idx_size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -110,20 +130,20 @@ while(1){
|
|||
|
||||
}
|
||||
|
||||
if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){
|
||||
if(index_mode>=2 || (demuxer->idx_size==0 && index_mode==1)){
|
||||
// build index for file:
|
||||
stream_reset(demuxer->stream);
|
||||
stream_seek(demuxer->stream,avi_header.movi_start);
|
||||
stream_seek(demuxer->stream,demuxer->movi_start);
|
||||
|
||||
avi_header.idx_pos=0;
|
||||
avi_header.idx=NULL;
|
||||
demuxer->idx_pos=0;
|
||||
demuxer->idx=NULL;
|
||||
|
||||
while(1){
|
||||
int id,len,skip;
|
||||
AVIINDEXENTRY* idx;
|
||||
unsigned char c;
|
||||
demuxer->filepos=stream_tell(demuxer->stream);
|
||||
if(demuxer->filepos>=avi_header.movi_end) break;
|
||||
if(demuxer->filepos>=demuxer->movi_end) break;
|
||||
id=stream_read_dword_le(demuxer->stream);
|
||||
len=stream_read_dword_le(demuxer->stream);
|
||||
if(id==mmioFOURCC('L','I','S','T')){
|
||||
|
@ -131,12 +151,12 @@ if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){
|
|||
continue;
|
||||
}
|
||||
if(stream_eof(demuxer->stream)) break;
|
||||
if(avi_header.idx_pos<=avi_header.idx_size){
|
||||
avi_header.idx_size+=32;
|
||||
avi_header.idx=realloc(avi_header.idx,avi_header.idx_size*sizeof(AVIINDEXENTRY));
|
||||
if(!avi_header.idx){avi_header.idx_pos=0; break;} // error!
|
||||
if(demuxer->idx_pos<=demuxer->idx_size){
|
||||
demuxer->idx_size+=32;
|
||||
demuxer->idx=realloc(demuxer->idx,demuxer->idx_size*sizeof(AVIINDEXENTRY));
|
||||
if(!demuxer->idx){demuxer->idx_pos=0; break;} // error!
|
||||
}
|
||||
idx=&avi_header.idx[avi_header.idx_pos++];
|
||||
idx=&((AVIINDEXENTRY *)demuxer->idx)[demuxer->idx_pos++];
|
||||
idx->ckid=id;
|
||||
idx->dwFlags=AVIIF_KEYFRAME; // FIXME
|
||||
idx->dwChunkOffset=demuxer->filepos;
|
||||
|
@ -163,8 +183,8 @@ if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){
|
|||
skip=(len+1)&(~1); // total bytes in this chunk
|
||||
stream_seek(demuxer->stream,8+demuxer->filepos+skip);
|
||||
}
|
||||
avi_header.idx_size=avi_header.idx_pos;
|
||||
printf("AVI: Generated index table for %d chunks!\n",avi_header.idx_size);
|
||||
demuxer->idx_size=demuxer->idx_pos;
|
||||
printf("AVI: Generated index table for %d chunks!\n",demuxer->idx_size);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
33
aviprint.c
33
aviprint.c
|
@ -1,3 +1,20 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
//extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "wine/mmreg.h"
|
||||
#include "wine/avifmt.h"
|
||||
#include "wine/vfw.h"
|
||||
|
||||
//#include "codec-cfg.h"
|
||||
//#include "stheader.h"
|
||||
|
||||
|
||||
void print_avih(MainAVIHeader *h){
|
||||
printf("======= AVI Header =======\n");
|
||||
printf("us/frame: %d (fps=%5.3f)\n",h->dwMicroSecPerFrame,1000000.0f/(float)h->dwMicroSecPerFrame);
|
||||
|
@ -56,15 +73,15 @@ void print_video_header(BITMAPINFOHEADER *h){
|
|||
}
|
||||
|
||||
|
||||
void print_index(){
|
||||
void print_index(AVIINDEXENTRY *idx,int idx_size){
|
||||
int i;
|
||||
for(i=0;i<avi_header.idx_size;i++){
|
||||
printf("%5d: %.4s %4X %08X (%08X) %d\n",i,
|
||||
&avi_header.idx[i].ckid,
|
||||
avi_header.idx[i].dwFlags,
|
||||
avi_header.idx[i].dwChunkOffset,
|
||||
avi_header.idx[i].dwChunkOffset+avi_header.movi_start,
|
||||
avi_header.idx[i].dwChunkLength
|
||||
for(i=0;i<idx_size;i++){
|
||||
printf("%5d: %.4s %4X %08X %d\n",i,
|
||||
&idx[i].ckid,
|
||||
idx[i].dwFlags,
|
||||
idx[i].dwChunkOffset,
|
||||
// idx[i].dwChunkOffset+demuxer->movi_start,
|
||||
idx[i].dwChunkLength
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
11
aviwrite.c
11
aviwrite.c
|
@ -1,4 +1,15 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "wine/mmreg.h"
|
||||
#include "wine/avifmt.h"
|
||||
#include "wine/vfw.h"
|
||||
|
||||
extern char* encode_name;
|
||||
extern char* encode_index_name;
|
||||
|
||||
void write_avi_chunk(FILE *f,unsigned int id,int len,void* data){
|
||||
|
||||
fwrite(&id,4,1,f);
|
||||
|
|
43
dec_audio.c
43
dec_audio.c
|
@ -1,4 +1,40 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "wine/mmreg.h"
|
||||
#include "wine/avifmt.h"
|
||||
#include "wine/vfw.h"
|
||||
|
||||
#include "codec-cfg.h"
|
||||
#include "stheader.h"
|
||||
|
||||
#include "mp3lib/mp3.h"
|
||||
#include "libac3/ac3.h"
|
||||
|
||||
#include "alaw.c"
|
||||
#include "xa/xa_gsm.h"
|
||||
|
||||
static sh_audio_t* ac3_audio_sh=NULL;
|
||||
|
||||
// AC3 decoder buffer callback:
|
||||
static void ac3_fill_buffer(uint8_t **start,uint8_t **end){
|
||||
int len=ds_get_packet(ac3_audio_sh->ds,start);
|
||||
//printf("<ac3:%d>\n",len);
|
||||
if(len<0)
|
||||
*start = *end = NULL;
|
||||
else
|
||||
*end = *start + len;
|
||||
}
|
||||
|
||||
|
||||
int init_audio(sh_audio_t *sh_audio){
|
||||
|
||||
int driver=sh_audio->codec->driver;
|
||||
|
@ -79,6 +115,7 @@ case 8: {
|
|||
}
|
||||
case 3: {
|
||||
// Dolby AC3 audio:
|
||||
ac3_audio_sh=sh_audio; // save sh_audio for the callback:
|
||||
ac3_config.fill_buffer_callback = ac3_fill_buffer;
|
||||
ac3_config.num_output_ch = 2;
|
||||
ac3_config.flags = 0;
|
||||
|
@ -91,7 +128,7 @@ case 3: {
|
|||
ac3_init();
|
||||
sh_audio->ac3_frame = ac3_decode_frame();
|
||||
if(sh_audio->ac3_frame){
|
||||
sh_audio->samplerate=sh_audio->ac3_frame->sampling_rate;
|
||||
sh_audio->samplerate=((ac3_frame_t*)sh_audio->ac3_frame)->sampling_rate;
|
||||
sh_audio->channels=2;
|
||||
} else {
|
||||
driver=0; // bad frame -> disable audio
|
||||
|
@ -179,7 +216,7 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){
|
|||
{ unsigned char buf[65]; // 65 bytes / frame
|
||||
len=0;
|
||||
while(len<OUTBURST){
|
||||
if(demux_read_data(d_audio,buf,65)!=65) break; // EOF
|
||||
if(demux_read_data(sh_audio->ds,buf,65)!=65) break; // EOF
|
||||
XA_MSGSM_Decoder(buf,(unsigned short *) buf); // decodes 65 byte -> 320 short
|
||||
// XA_GSM_Decoder(buf,(unsigned short *) &sh_audio->a_buffer[sh_audio->a_buffer_len]); // decodes 33 byte -> 160 short
|
||||
len+=2*320;
|
||||
|
@ -192,7 +229,7 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){
|
|||
//printf("{2:%d}",avi_header.idx_pos);fflush(stdout);
|
||||
if(sh_audio->ac3_frame){
|
||||
len = 256 * 6 *sh_audio->channels*sh_audio->samplesize;
|
||||
memcpy(buf,sh_audio->ac3_frame->audio_data,len);
|
||||
memcpy(buf,((ac3_frame_t*)sh_audio->ac3_frame)->audio_data,len);
|
||||
sh_audio->ac3_frame=NULL;
|
||||
}
|
||||
//printf("{3:%d}",avi_header.idx_pos);fflush(stdout);
|
||||
|
|
55
demux_asf.c
55
demux_asf.c
|
@ -1,5 +1,21 @@
|
|||
// ASF file parser for DEMUXER v0.3 by A'rpi/ESP-team
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
// defined at asfheader.c:
|
||||
extern unsigned char* asf_packet;
|
||||
extern int asf_scrambling_h;
|
||||
extern int asf_scrambling_w;
|
||||
extern int asf_scrambling_b;
|
||||
extern int asf_packetsize;
|
||||
|
||||
|
||||
// based on asf file-format doc by Eugene [http://divx.euro.ru]
|
||||
|
||||
//static float avi_pts_frametime=1.0f/25.0f;
|
||||
|
@ -15,6 +31,25 @@ typedef struct __attribute__((packed)) {
|
|||
unsigned char flag;
|
||||
} ASF_segmhdr_t;
|
||||
|
||||
static void asf_descrambling(unsigned char *src,int len){
|
||||
unsigned char *dst=malloc(len);
|
||||
unsigned char *s2=src;
|
||||
int i=0,x,y;
|
||||
while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
|
||||
// printf("descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
|
||||
//i+=asf_scrambling_h*asf_scrambling_w;
|
||||
for(x=0;x<asf_scrambling_w;x++)
|
||||
for(y=0;y<asf_scrambling_h;y++){
|
||||
memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
|
||||
i+=asf_scrambling_b;
|
||||
}
|
||||
s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b;
|
||||
}
|
||||
//if(i<len) memcpy(dst+i,src+i,len-i);
|
||||
memcpy(src,dst,i);
|
||||
free(dst);
|
||||
}
|
||||
|
||||
|
||||
static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs){
|
||||
demux_stream_t *ds=NULL;
|
||||
|
@ -22,18 +57,18 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
|
|||
if(verbose>=4) printf("demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len);
|
||||
|
||||
if(demux->video->id==-1)
|
||||
if(avi_header.v_streams[id])
|
||||
if(demux->v_streams[id])
|
||||
demux->video->id=id;
|
||||
|
||||
if(demux->audio->id==-1)
|
||||
if(avi_header.a_streams[id])
|
||||
if(demux->a_streams[id])
|
||||
demux->audio->id=id;
|
||||
|
||||
if(id==demux->audio->id){
|
||||
// audio
|
||||
ds=demux->audio;
|
||||
if(!ds->sh){
|
||||
ds->sh=avi_header.a_streams[id];
|
||||
ds->sh=demux->a_streams[id];
|
||||
if(verbose) printf("Auto-selected ASF audio ID = %d\n",ds->id);
|
||||
}
|
||||
} else
|
||||
|
@ -41,7 +76,7 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
|
|||
// video
|
||||
ds=demux->video;
|
||||
if(!ds->sh){
|
||||
ds->sh=avi_header.v_streams[id];
|
||||
ds->sh=demux->v_streams[id];
|
||||
if(verbose) printf("Auto-selected ASF video ID = %d\n",ds->id);
|
||||
}
|
||||
}
|
||||
|
@ -97,19 +132,19 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
|
|||
int demux_asf_fill_buffer(demuxer_t *demux){
|
||||
|
||||
demux->filepos=stream_tell(demux->stream);
|
||||
if(demux->filepos>=demux->endpos){
|
||||
if(demux->filepos>=demux->movi_end){
|
||||
demux->stream->eof=1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
stream_read(demux->stream,asf_packet,(int)fileh.packetsize);
|
||||
stream_read(demux->stream,asf_packet,asf_packetsize);
|
||||
if(demux->stream->eof) return 0; // EOF
|
||||
|
||||
if(asf_packet[0]==0x82){
|
||||
unsigned char flags=asf_packet[3];
|
||||
unsigned char segtype=asf_packet[4];
|
||||
unsigned char* p=&asf_packet[5];
|
||||
unsigned char* p_end=p+(int)fileh.packetsize;
|
||||
unsigned char* p_end=p+asf_packetsize;
|
||||
unsigned long time;
|
||||
unsigned short duration;
|
||||
int segs=1;
|
||||
|
@ -131,11 +166,11 @@ int demux_asf_fill_buffer(demuxer_t *demux){
|
|||
// Explicit (absoulte) packet size
|
||||
plen=p[0]|(p[1]<<8); p+=2;
|
||||
if(verbose>1)printf("Explicit packet size specified: %d \n",plen);
|
||||
if(plen>fileh.packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,(int)fileh.packetsize);
|
||||
if(plen>asf_packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize);
|
||||
if(flags&(8|16)){
|
||||
padding=p[0];p++;
|
||||
if(flags&16){ padding|=p[0]<<8; p++;}
|
||||
if(verbose)printf("Warning! explicit=%d padding=%d \n",plen,fileh.packetsize-padding);
|
||||
if(verbose)printf("Warning! explicit=%d padding=%d \n",plen,asf_packetsize-padding);
|
||||
}
|
||||
} else {
|
||||
// Padding (relative) size
|
||||
|
@ -145,7 +180,7 @@ int demux_asf_fill_buffer(demuxer_t *demux){
|
|||
if(flags&16){
|
||||
padding=p[0]|(p[1]<<8);p+=2;
|
||||
}
|
||||
plen=fileh.packetsize-padding;
|
||||
plen=asf_packetsize-padding;
|
||||
}
|
||||
|
||||
time=*((unsigned long*)p);p+=4;
|
||||
|
|
82
demux_avi.c
82
demux_avi.c
|
@ -1,44 +1,51 @@
|
|||
// AVI file parser for DEMUXER v2.6 by A'rpi/ESP-team
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "wine/mmreg.h"
|
||||
#include "wine/avifmt.h"
|
||||
#include "wine/vfw.h"
|
||||
|
||||
#include "codec-cfg.h"
|
||||
#include "stheader.h"
|
||||
|
||||
//static float avi_pts_frametime=1.0f/25.0f;
|
||||
static float avi_audio_pts=0;
|
||||
static float avi_video_pts=0;
|
||||
|
||||
static int skip_video_frames=0;
|
||||
|
||||
static inline int avi_stream_id(unsigned int id){
|
||||
unsigned char *p=(unsigned char *)&id;
|
||||
unsigned char a,b;
|
||||
a=p[0]-'0'; b=p[1]-'0';
|
||||
if(a>9 || b>9) return 100; // invalid ID
|
||||
return a*10+b;
|
||||
}
|
||||
float avi_audio_pts=0;
|
||||
float avi_video_pts=0;
|
||||
//float avi_video_ftime=0.04;
|
||||
int skip_video_frames=0;
|
||||
|
||||
// Select ds from ID
|
||||
static inline demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
|
||||
demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
|
||||
int stream_id=avi_stream_id(id);
|
||||
|
||||
// printf("demux_avi_select_stream(%d) {a:%d/v:%d}\n",stream_id,
|
||||
// demux->audio->id,demux->video->id);
|
||||
|
||||
if(demux->video->id==-1)
|
||||
if(avi_header.v_streams[stream_id])
|
||||
if(demux->v_streams[stream_id])
|
||||
demux->video->id=stream_id;
|
||||
|
||||
if(demux->audio->id==-1)
|
||||
if(avi_header.a_streams[stream_id])
|
||||
if(demux->a_streams[stream_id])
|
||||
demux->audio->id=stream_id;
|
||||
|
||||
if(stream_id==demux->audio->id){
|
||||
if(!demux->audio->sh){
|
||||
demux->audio->sh=avi_header.a_streams[stream_id];
|
||||
demux->audio->sh=demux->a_streams[stream_id];
|
||||
if(verbose) printf("Auto-selected AVI audio ID = %d\n",demux->audio->id);
|
||||
}
|
||||
return demux->audio;
|
||||
}
|
||||
if(stream_id==demux->video->id){
|
||||
if(!demux->video->sh){
|
||||
demux->video->sh=avi_header.v_streams[stream_id];
|
||||
demux->video->sh=demux->v_streams[stream_id];
|
||||
if(verbose) printf("Auto-selected AVI video ID = %d\n",demux->video->id);
|
||||
}
|
||||
return demux->video;
|
||||
|
@ -74,7 +81,9 @@ static int demux_avi_read_packet(demuxer_t *demux,unsigned int id,unsigned int l
|
|||
//avi_video_pts+=avi_pts_frametime;
|
||||
//avi_video_pts+=(float)avi_header.video.dwScale/(float)avi_header.video.dwRate;
|
||||
//avi_video_pts+=((sh_video_t*)ds->sh)->frametime;
|
||||
// FIXME!!!
|
||||
avi_video_pts+=(float)((sh_video_t*)(demux->video->sh))->video.dwScale/(float)((sh_video_t*)(demux->video->sh))->video.dwRate;
|
||||
// avi_video_pts+=avi_video_ftime;
|
||||
avi_audio_pts=avi_video_pts;
|
||||
}
|
||||
|
||||
|
@ -108,19 +117,19 @@ int ret=0;
|
|||
do{
|
||||
AVIINDEXENTRY *idx=NULL;
|
||||
demux->filepos=stream_tell(demux->stream);
|
||||
if(demux->filepos>=demux->endpos){
|
||||
if(demux->filepos>=demux->movi_end){
|
||||
demux->stream->eof=1;
|
||||
return 0;
|
||||
}
|
||||
if(stream_eof(demux->stream)) return 0;
|
||||
if(avi_header.idx_size>0 && avi_header.idx_pos<avi_header.idx_size){
|
||||
if(demux->idx_size>0 && demux->idx_pos<demux->idx_size){
|
||||
unsigned int pos;
|
||||
|
||||
//if(avi_header.idx_pos<0) printf("Fatal! idx_pos=%d\n",avi_header.idx_pos);
|
||||
//if(demux->idx_pos<0) printf("Fatal! idx_pos=%d\n",demux->idx_pos);
|
||||
|
||||
idx=&avi_header.idx[avi_header.idx_pos++];
|
||||
idx=&((AVIINDEXENTRY *)demux->idx)[demux->idx_pos++];
|
||||
|
||||
//printf("[%d]",avi_header.idx_pos);fflush(stdout);
|
||||
//printf("[%d]",demux->idx_pos);fflush(stdout);
|
||||
|
||||
//stream_seek(demux->stream,idx.dwChunkOffset);
|
||||
//printf("IDX pos=%X idx.pos=%X idx.size=%X idx.flags=%X\n",demux->filepos,
|
||||
|
@ -134,8 +143,8 @@ do{
|
|||
continue; // skip this chunk
|
||||
}
|
||||
|
||||
pos=idx->dwChunkOffset+avi_header.idx_offset;
|
||||
if(pos<avi_header.movi_start || pos>=avi_header.movi_end){
|
||||
pos=idx->dwChunkOffset+demux->idx_offset;
|
||||
if(pos<demux->movi_start || pos>=demux->movi_end){
|
||||
printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
|
||||
continue;
|
||||
}
|
||||
|
@ -165,7 +174,7 @@ do{
|
|||
continue;
|
||||
}
|
||||
}
|
||||
ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1);
|
||||
ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
|
||||
if(!ret && skip_video_frames<=0)
|
||||
if(--max_packs==0){
|
||||
demux->stream->eof=1;
|
||||
|
@ -191,13 +200,14 @@ do{
|
|||
int idx_pos=0;
|
||||
demux->filepos=stream_tell(demux->stream);
|
||||
|
||||
if(ds==demux->video) idx_pos=avi_header.idx_pos_a++; else
|
||||
if(ds==demux->audio) idx_pos=avi_header.idx_pos_v++; else
|
||||
idx_pos=avi_header.idx_pos++;
|
||||
if(ds==demux->video) idx_pos=demux->idx_pos_a++; else
|
||||
if(ds==demux->audio) idx_pos=demux->idx_pos_v++; else
|
||||
idx_pos=demux->idx_pos++;
|
||||
|
||||
if(avi_header.idx_size>0 && idx_pos<avi_header.idx_size){
|
||||
if(demux->idx_size>0 && idx_pos<demux->idx_size){
|
||||
unsigned int pos;
|
||||
idx=&avi_header.idx[idx_pos];
|
||||
idx=&((AVIINDEXENTRY *)demux->idx)[idx_pos];
|
||||
// idx=&demux->idx[idx_pos];
|
||||
|
||||
if(idx->dwFlags&AVIIF_LIST){
|
||||
// LIST
|
||||
|
@ -208,8 +218,8 @@ do{
|
|||
continue; // skip this chunk
|
||||
}
|
||||
|
||||
pos=idx->dwChunkOffset+avi_header.idx_offset;
|
||||
if(pos<avi_header.movi_start || pos>=avi_header.movi_end){
|
||||
pos=idx->dwChunkOffset+demux->idx_offset;
|
||||
if(pos<demux->movi_start || pos>=demux->movi_end){
|
||||
printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
|
||||
continue;
|
||||
}
|
||||
|
@ -257,8 +267,8 @@ unsigned int len;
|
|||
int ret=0;
|
||||
int *fpos=NULL;
|
||||
|
||||
if(ds==demux->video) fpos=&avi_header.idx_pos_a; else
|
||||
if(ds==demux->audio) fpos=&avi_header.idx_pos_v; else
|
||||
if(ds==demux->video) fpos=&demux->idx_pos_a; else
|
||||
if(ds==demux->audio) fpos=&demux->idx_pos_v; else
|
||||
return 0;
|
||||
|
||||
stream_seek(demux->stream,fpos[0]);
|
||||
|
@ -266,7 +276,7 @@ int *fpos=NULL;
|
|||
do{
|
||||
|
||||
demux->filepos=stream_tell(demux->stream);
|
||||
if(demux->filepos>=demux->endpos){
|
||||
if(demux->filepos>=demux->movi_end){
|
||||
demux->stream->eof=1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -281,7 +291,7 @@ do{
|
|||
|
||||
if(ds==demux_avi_select_stream(demux,id)){
|
||||
// read it!
|
||||
ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1);
|
||||
ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
|
||||
} else {
|
||||
// skip it!
|
||||
int skip=(len+1)&(~1); // total bytes in this chunk
|
||||
|
|
28
demux_mpg.c
28
demux_mpg.c
|
@ -1,5 +1,13 @@
|
|||
// MPG/VOB file parser for DEMUXER v2.5 by A'rpi/ESP-team
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
//#define MAX_PS_PACKETSIZE 2048
|
||||
#define MAX_PS_PACKETSIZE (224*1024)
|
||||
|
||||
|
@ -128,9 +136,9 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
|||
// subtitle:
|
||||
aid&=0x1F;
|
||||
|
||||
if(!avi_header.s_streams[aid]){
|
||||
if(!demux->s_streams[aid]){
|
||||
printf("==> Found subtitle: %d\n",aid);
|
||||
avi_header.s_streams[aid]=1;
|
||||
demux->s_streams[aid]=1;
|
||||
// new_sh_audio(aid);
|
||||
}
|
||||
|
||||
|
@ -144,13 +152,13 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
|||
// aid=128+(aid&0x7F);
|
||||
// aid=0x80..0xBF
|
||||
|
||||
if(!avi_header.a_streams[aid]) new_sh_audio(aid);
|
||||
if(!demux->a_streams[aid]) new_sh_audio(aid);
|
||||
if(demux->audio->id==-1) demux->audio->id=aid;
|
||||
|
||||
if(demux->audio->id==aid){
|
||||
// int type;
|
||||
ds=demux->audio;
|
||||
if(!ds->sh) ds->sh=avi_header.a_streams[aid];
|
||||
if(!ds->sh) ds->sh=demux->a_streams[aid];
|
||||
// READ Packet: Skip additional audio header data:
|
||||
c=stream_read_char(demux->stream);//type=c;
|
||||
c=stream_read_char(demux->stream);//type|=c<<8;
|
||||
|
@ -197,22 +205,22 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
|||
if(id>=0x1C0 && id<=0x1DF){
|
||||
// mpeg audio
|
||||
int aid=id-0x1C0;
|
||||
if(!avi_header.a_streams[aid]) new_sh_audio(aid);
|
||||
if(!demux->a_streams[aid]) new_sh_audio(aid);
|
||||
if(demux->audio->id==-1) demux->audio->id=aid;
|
||||
if(demux->audio->id==aid){
|
||||
ds=demux->audio;
|
||||
if(!ds->sh) ds->sh=avi_header.a_streams[aid];
|
||||
if(!ds->sh) ds->sh=demux->a_streams[aid];
|
||||
if(ds->type==-1) ds->type=1;
|
||||
}
|
||||
} else
|
||||
if(id>=0x1E0 && id<=0x1EF){
|
||||
// mpeg video
|
||||
int aid=id-0x1E0;
|
||||
if(!avi_header.v_streams[aid]) new_sh_video(aid);
|
||||
if(!demux->v_streams[aid]) new_sh_video(aid);
|
||||
if(demux->video->id==-1) demux->video->id=aid;
|
||||
if(demux->video->id==aid){
|
||||
ds=demux->video;
|
||||
if(!ds->sh) ds->sh=avi_header.v_streams[aid];
|
||||
if(!ds->sh) ds->sh=demux->v_streams[aid];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -234,8 +242,8 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int num_elementary_packets100=0;
|
||||
static int num_elementary_packets101=0;
|
||||
int num_elementary_packets100=0;
|
||||
int num_elementary_packets101=0;
|
||||
|
||||
int demux_mpg_es_fill_buffer(demuxer_t *demux){
|
||||
//if(demux->type==DEMUXER_TYPE_MPEG_ES)
|
||||
|
|
114
demuxer.c
114
demuxer.c
|
@ -1,53 +1,12 @@
|
|||
//=================== DEMUXER v2.5 =========================
|
||||
|
||||
#define MAX_PACKS 2048
|
||||
#define MAX_PACK_BYTES 0x400000
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct demux_packet_st {
|
||||
int len;
|
||||
float pts;
|
||||
int pos; // pozicio indexben (AVI) ill. fileban (MPG)
|
||||
unsigned char* buffer;
|
||||
struct demux_packet_st* next;
|
||||
} demux_packet_t;
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
inline demux_packet_t* new_demux_packet(int len){
|
||||
demux_packet_t* dp=malloc(sizeof(demux_packet_t));
|
||||
dp->len=len;
|
||||
dp->buffer=malloc(len);
|
||||
dp->next=NULL;
|
||||
dp->pts=0;
|
||||
dp->pos=0;
|
||||
return dp;
|
||||
}
|
||||
|
||||
inline void free_demux_packet(demux_packet_t* dp){
|
||||
free(dp->buffer);
|
||||
free(dp);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
int buffer_pos; // current buffer position
|
||||
int buffer_size; // current buffer size
|
||||
unsigned char* buffer; // current buffer
|
||||
float pts; // current buffer's pts
|
||||
int eof; // end of demuxed stream? (true if all buffer empty)
|
||||
int pos; // position in the input stream (file)
|
||||
int dpos; // position in the demuxed stream
|
||||
//---------------
|
||||
int packs; // number of packets in buffer
|
||||
int bytes; // total bytes of packets in buffer
|
||||
demux_packet_t *first; // read to current buffer from here
|
||||
demux_packet_t *last; // append new packets from input stream to here
|
||||
int id; // stream ID (for multiple audio/video streams)
|
||||
int type; // stream type (currently used only for audio)
|
||||
struct demuxer_st *demuxer; // parent demuxer structure (stream handler)
|
||||
// ---- asf -----
|
||||
demux_packet_t *asf_packet; // read asf fragments here
|
||||
int asf_seq;
|
||||
// ---- stream header ----
|
||||
void* sh;
|
||||
} demux_stream_t;
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
|
||||
demux_stream_t* ds=malloc(sizeof(demux_stream_t));
|
||||
|
@ -72,33 +31,9 @@ demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
|
|||
return ds;
|
||||
}
|
||||
|
||||
#define DEMUXER_TYPE_UNKNOWN 0
|
||||
#define DEMUXER_TYPE_MPEG_ES 1
|
||||
#define DEMUXER_TYPE_MPEG_PS 2
|
||||
#define DEMUXER_TYPE_AVI 3
|
||||
#define DEMUXER_TYPE_AVI_NI 4
|
||||
#define DEMUXER_TYPE_AVI_NINI 5
|
||||
#define DEMUXER_TYPE_ASF 6
|
||||
|
||||
#define DEMUXER_TIME_NONE 0
|
||||
#define DEMUXER_TIME_PTS 1
|
||||
#define DEMUXER_TIME_FILE 2
|
||||
#define DEMUXER_TIME_BPS 3
|
||||
|
||||
typedef struct demuxer_st {
|
||||
stream_t *stream;
|
||||
int synced; // stream synced (used by mpeg)
|
||||
int filepos; // input stream current pos.
|
||||
int endpos; // input stream end pos. (return EOF fi filepos>endpos)
|
||||
int type; // mpeg system stream, mpeg elementary s., avi raw, avi indexed
|
||||
// int time_src;// time source (pts/file/bps)
|
||||
demux_stream_t *audio;
|
||||
demux_stream_t *video;
|
||||
demux_stream_t *sub;
|
||||
} demuxer_t;
|
||||
|
||||
demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id){
|
||||
demuxer_t *d=malloc(sizeof(demuxer_t));
|
||||
memset(d,0,sizeof(demuxer_t));
|
||||
d->stream=stream;
|
||||
d->synced=0;
|
||||
d->filepos=0;
|
||||
|
@ -109,7 +44,7 @@ demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id){
|
|||
return d;
|
||||
}
|
||||
|
||||
static void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){
|
||||
void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){
|
||||
// demux_packet_t* dp=new_demux_packet(len);
|
||||
// stream_read(stream,dp->buffer,len);
|
||||
// dp->pts=pts; //(float)pts/90000.0f;
|
||||
|
@ -131,7 +66,7 @@ static void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){
|
|||
dp->len,dp->pts,dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs);
|
||||
}
|
||||
|
||||
static void ds_read_packet(demux_stream_t *ds,stream_t *stream,int len,float pts,int pos){
|
||||
void ds_read_packet(demux_stream_t *ds,stream_t *stream,int len,float pts,int pos){
|
||||
demux_packet_t* dp=new_demux_packet(len);
|
||||
stream_read(stream,dp->buffer,len);
|
||||
dp->pts=pts; //(float)pts/90000.0f;
|
||||
|
@ -140,7 +75,6 @@ static void ds_read_packet(demux_stream_t *ds,stream_t *stream,int len,float pts
|
|||
ds_add_packet(ds,dp);
|
||||
}
|
||||
|
||||
|
||||
// return value:
|
||||
// 0 = EOF or no stream found or invalid type
|
||||
// 1 = successfully read a packet
|
||||
|
@ -167,13 +101,13 @@ int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
|
|||
// return value:
|
||||
// 0 = EOF
|
||||
// 1 = succesfull
|
||||
inline static int ds_fill_buffer(demux_stream_t *ds){
|
||||
int ds_fill_buffer(demux_stream_t *ds){
|
||||
demuxer_t *demux=ds->demuxer;
|
||||
if(ds->buffer) free(ds->buffer);
|
||||
if(verbose>2){
|
||||
if(ds==demux->audio) printf("ds_fill_buffer(d_audio) called\n");else
|
||||
if(ds==demux->video) printf("ds_fill_buffer(d_video) called\n");else
|
||||
printf("ds_fill_buffer(unknown 0x%X) called\n",ds);
|
||||
printf("ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds);
|
||||
}
|
||||
while(1){
|
||||
if(ds->packs){
|
||||
|
@ -212,11 +146,7 @@ inline static int ds_fill_buffer(demux_stream_t *ds){
|
|||
return 0;
|
||||
}
|
||||
|
||||
inline int ds_tell(demux_stream_t *ds){
|
||||
return (ds->dpos-ds->buffer_size)+ds->buffer_pos;
|
||||
}
|
||||
|
||||
int demux_read_data(demux_stream_t *ds,char* mem,int len){
|
||||
int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){
|
||||
int x;
|
||||
int bytes=0;
|
||||
while(len>0){
|
||||
|
@ -232,24 +162,6 @@ while(len>0){
|
|||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
#if 1
|
||||
#define demux_getc(ds) (\
|
||||
(ds->buffer_pos<ds->buffer_size) ? ds->buffer[ds->buffer_pos++] \
|
||||
:((!ds_fill_buffer(ds))? (-1) : ds->buffer[ds->buffer_pos++] ) )
|
||||
#else
|
||||
inline static int demux_getc(demux_stream_t *ds){
|
||||
if(ds->buffer_pos>=ds->buffer_size){
|
||||
if(!ds_fill_buffer(ds)){
|
||||
// printf("DEMUX_GETC: EOF reached!\n");
|
||||
return -1; // EOF
|
||||
}
|
||||
}
|
||||
// printf("[%02X]",ds->buffer[ds->buffer_pos]);
|
||||
return ds->buffer[ds->buffer_pos++];
|
||||
}
|
||||
#endif
|
||||
|
||||
void ds_free_packs(demux_stream_t *ds){
|
||||
demux_packet_t *dp=ds->first;
|
||||
while(dp){
|
||||
|
@ -273,7 +185,7 @@ void ds_free_packs(demux_stream_t *ds){
|
|||
ds->pts=0;
|
||||
}
|
||||
|
||||
int ds_get_packet(demux_stream_t *ds,char **start){
|
||||
int ds_get_packet(demux_stream_t *ds,unsigned char **start){
|
||||
while(1){
|
||||
int len;
|
||||
if(ds->buffer_pos>=ds->buffer_size){
|
||||
|
@ -290,7 +202,7 @@ int ds_get_packet(demux_stream_t *ds,char **start){
|
|||
}
|
||||
}
|
||||
|
||||
int ds_get_packet_sub(demux_stream_t *ds,char **start){
|
||||
int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){
|
||||
while(1){
|
||||
int len;
|
||||
if(ds->buffer_pos>=ds->buffer_size){
|
||||
|
|
26
dll_init.c
26
dll_init.c
|
@ -1,3 +1,27 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
extern int verbose; // defined in mplayer.c
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "loader.h"
|
||||
//#include "wine/mmreg.h"
|
||||
//#include "wine/vfw.h"
|
||||
#include "wine/avifmt.h"
|
||||
|
||||
#include "codec-cfg.h"
|
||||
#include "stheader.h"
|
||||
|
||||
#include "libvo/img_format.h"
|
||||
#include "linux/shmem.h"
|
||||
|
||||
extern char* win32_codec_name; // must be set before calling DrvOpen() !!!
|
||||
|
||||
// ACM audio and VfW video codecs initialization
|
||||
// based on the avifile library [http://divx.euro.ru]
|
||||
|
||||
|
@ -100,7 +124,7 @@ int acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int len){
|
|||
|
||||
|
||||
|
||||
int init_video_codec(){
|
||||
int init_video_codec(sh_video_t *sh_video){
|
||||
HRESULT ret;
|
||||
int yuv=0;
|
||||
unsigned int outfmt=sh_video->codec->outfmt[sh_video->outfmtidx];
|
||||
|
|
210
mplayer.c
210
mplayer.c
|
@ -3,12 +3,6 @@
|
|||
// Enable ALSA emulation (using 32kB audio buffer) - timer testing only
|
||||
//#define SIMULATE_ALSA
|
||||
|
||||
#ifdef USE_XMMP_AUDIO
|
||||
#define OUTBURST 4096
|
||||
#else
|
||||
//#define OUTBURST 1024
|
||||
#define OUTBURST 512
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -90,6 +84,11 @@ int verbose=0;
|
|||
|
||||
#define ABS(x) (((x)>=0)?(x):(-(x)))
|
||||
|
||||
static subtitle* subtitles=NULL;
|
||||
void find_sub(subtitle* subtitles,int key);
|
||||
|
||||
|
||||
#if 0
|
||||
//**************************************************************************//
|
||||
// .SUB
|
||||
//**************************************************************************//
|
||||
|
@ -185,6 +184,7 @@ void find_sub(int key){
|
|||
vo_sub=NULL; // no sub here
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//**************************************************************************//
|
||||
// Config file
|
||||
|
@ -234,15 +234,17 @@ static int max_framesize=0;
|
|||
//**************************************************************************//
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.c"
|
||||
#include "demuxer.h"
|
||||
|
||||
#include "stheader.h"
|
||||
|
||||
#if 0
|
||||
|
||||
typedef struct {
|
||||
// file:
|
||||
MainAVIHeader avih;
|
||||
unsigned int movi_start;
|
||||
unsigned int movi_end;
|
||||
// MainAVIHeader avih;
|
||||
// unsigned int movi_start;
|
||||
// unsigned int movi_end;
|
||||
// index:
|
||||
AVIINDEXENTRY* idx;
|
||||
int idx_size;
|
||||
|
@ -250,45 +252,46 @@ typedef struct {
|
|||
int idx_pos_a;
|
||||
int idx_pos_v;
|
||||
int idx_offset; // ennyit kell hozzaadni az index offset ertekekhez
|
||||
// streams:
|
||||
sh_audio_t* a_streams[256];
|
||||
sh_video_t* v_streams[256];
|
||||
char s_streams[32]; // dvd subtitles
|
||||
// video:
|
||||
unsigned int bitrate;
|
||||
} avi_header_t;
|
||||
|
||||
avi_header_t avi_header;
|
||||
|
||||
#include "aviprint.c"
|
||||
#endif
|
||||
|
||||
int avi_bitrate=0;
|
||||
|
||||
demuxer_t *demuxer=NULL;
|
||||
|
||||
//#include "aviprint.c"
|
||||
|
||||
sh_audio_t* new_sh_audio(int id){
|
||||
if(avi_header.a_streams[id]){
|
||||
if(demuxer->a_streams[id]){
|
||||
printf("Warning! Audio stream header %d redefined!\n",id);
|
||||
} else {
|
||||
printf("==> Found audio stream: %d\n",id);
|
||||
avi_header.a_streams[id]=malloc(sizeof(sh_audio_t));
|
||||
memset(avi_header.a_streams[id],0,sizeof(sh_audio_t));
|
||||
demuxer->a_streams[id]=malloc(sizeof(sh_audio_t));
|
||||
memset(demuxer->a_streams[id],0,sizeof(sh_audio_t));
|
||||
}
|
||||
return avi_header.a_streams[id];
|
||||
return demuxer->a_streams[id];
|
||||
}
|
||||
|
||||
sh_video_t* new_sh_video(int id){
|
||||
if(avi_header.v_streams[id]){
|
||||
if(demuxer->v_streams[id]){
|
||||
printf("Warning! video stream header %d redefined!\n",id);
|
||||
} else {
|
||||
printf("==> Found video stream: %d\n",id);
|
||||
avi_header.v_streams[id]=malloc(sizeof(sh_video_t));
|
||||
memset(avi_header.v_streams[id],0,sizeof(sh_video_t));
|
||||
demuxer->v_streams[id]=malloc(sizeof(sh_video_t));
|
||||
memset(demuxer->v_streams[id],0,sizeof(sh_video_t));
|
||||
}
|
||||
return avi_header.v_streams[id];
|
||||
return demuxer->v_streams[id];
|
||||
}
|
||||
|
||||
|
||||
#include "demux_avi.c"
|
||||
#include "demux_mpg.c"
|
||||
//#include "demux_avi.c"
|
||||
//#include "demux_mpg.c"
|
||||
|
||||
demuxer_t *demuxer=NULL;
|
||||
demux_stream_t *d_audio=NULL;
|
||||
demux_stream_t *d_video=NULL;
|
||||
demux_stream_t *d_dvdsub=NULL;
|
||||
|
@ -300,9 +303,25 @@ char* encode_name=NULL;
|
|||
char* encode_index_name=NULL;
|
||||
int encode_bitrate=0;
|
||||
|
||||
extern int asf_packetsize;
|
||||
|
||||
extern float avi_audio_pts;
|
||||
extern float avi_video_pts;
|
||||
extern float avi_video_ftime;
|
||||
extern int skip_video_frames;
|
||||
|
||||
void read_avi_header(demuxer_t *demuxer,int index_mode);
|
||||
demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id);
|
||||
|
||||
int asf_check_header(demuxer_t *demuxer);
|
||||
int read_asf_header(demuxer_t *demuxer);
|
||||
|
||||
// MPEG video stream parser:
|
||||
#include "parse_es.c"
|
||||
|
||||
extern int num_elementary_packets100;
|
||||
extern int num_elementary_packets101;
|
||||
|
||||
extern picture_t *picture;
|
||||
|
||||
static const int frameratecode2framerate[16] = {
|
||||
|
@ -321,20 +340,8 @@ int mplayer_audio_read(char *buf,int size){
|
|||
return len;
|
||||
}
|
||||
|
||||
// AC3 decoder buffer callback:
|
||||
static void ac3_fill_buffer(uint8_t **start,uint8_t **end){
|
||||
int len=ds_get_packet(sh_audio->ds,(char**)start);
|
||||
//printf("<ac3:%d>\n",len);
|
||||
if(len<0)
|
||||
*start = *end = NULL;
|
||||
else
|
||||
*end = *start + len;
|
||||
}
|
||||
|
||||
#include "alaw.c"
|
||||
#include "xa/xa_gsm.h"
|
||||
|
||||
#include "dec_audio.c"
|
||||
//#include "dec_audio.c"
|
||||
|
||||
//**************************************************************************//
|
||||
// The OpenDivX stuff:
|
||||
|
@ -386,15 +393,15 @@ while(len>0){
|
|||
//**************************************************************************//
|
||||
|
||||
// AVI file header reader/parser/writer:
|
||||
#include "aviheader.c"
|
||||
#include "aviwrite.c"
|
||||
//#include "aviheader.c"
|
||||
//#include "aviwrite.c"
|
||||
|
||||
// ASF headers:
|
||||
#include "asfheader.c"
|
||||
#include "demux_asf.c"
|
||||
//#include "asfheader.c"
|
||||
//#include "demux_asf.c"
|
||||
|
||||
// DLL codecs init routines
|
||||
#include "dll_init.c"
|
||||
//#include "dll_init.c"
|
||||
|
||||
// Common FIFO functions, and keyboard/event FIFO code
|
||||
#include "fifo.c"
|
||||
|
@ -443,7 +450,6 @@ void exit_sighandler(int x){
|
|||
}
|
||||
|
||||
int divx_quality=0;
|
||||
extern int vo_dbpp;
|
||||
|
||||
int main(int argc,char* argv[], char *envp[]){
|
||||
char* filename=NULL; //"MI2-Trailer.avi";
|
||||
|
@ -610,7 +616,7 @@ if(vcd_track){
|
|||
if(f<0){ printf("CD-ROM Device '%s' not found!\n",filename);return 1; }
|
||||
vcd_read_toc(f);
|
||||
ret=vcd_seek_to_track(f,vcd_track);
|
||||
if(ret==-1){ printf("Error selecting VCD track!\n");return 1;}
|
||||
if(ret<0){ printf("Error selecting VCD track!\n");return 1;}
|
||||
seek_to_byte+=ret;
|
||||
if(verbose) printf("VCD start byte position: 0x%X\n",seek_to_byte);
|
||||
stream_type=STREAMTYPE_VCD;
|
||||
|
@ -638,7 +644,6 @@ if(vcd_track){
|
|||
}
|
||||
|
||||
stream=new_stream(f,stream_type);
|
||||
|
||||
//============ Open & Sync stream and detect file format ===============
|
||||
|
||||
if(!has_audio) audio_id=-2; // do NOT read audio packets...
|
||||
|
@ -647,6 +652,7 @@ if(!has_audio) audio_id=-2; // do NOT read audio packets...
|
|||
stream_reset(stream);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_AVI,audio_id,video_id,dvdsub_id);
|
||||
stream_seek(demuxer->stream,seek_to_byte);
|
||||
//printf("stream3=0x%X vs. 0x%X\n",demuxer->stream,stream);
|
||||
{ //---- RIFF header:
|
||||
int id=stream_read_dword_le(demuxer->stream); // "RIFF"
|
||||
if(id==mmioFOURCC('R','I','F','F')){
|
||||
|
@ -663,7 +669,7 @@ if(file_format==DEMUXER_TYPE_UNKNOWN){
|
|||
stream_reset(stream);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_ASF,audio_id,video_id,dvdsub_id);
|
||||
stream_seek(demuxer->stream,seek_to_byte);
|
||||
if(asf_check_header()){
|
||||
if(asf_check_header(demuxer)){
|
||||
printf("Detected ASF file format!\n");
|
||||
file_format=DEMUXER_TYPE_ASF;
|
||||
}
|
||||
|
@ -722,31 +728,31 @@ d_dvdsub=demuxer->sub;
|
|||
switch(file_format){
|
||||
case DEMUXER_TYPE_AVI: {
|
||||
//---- AVI header:
|
||||
read_avi_header(index_mode);
|
||||
read_avi_header(demuxer,index_mode);
|
||||
stream_reset(demuxer->stream);
|
||||
stream_seek(demuxer->stream,avi_header.movi_start);
|
||||
avi_header.idx_pos=0;
|
||||
avi_header.idx_pos_a=0;
|
||||
avi_header.idx_pos_v=0;
|
||||
if(avi_header.idx_size>0){
|
||||
stream_seek(demuxer->stream,demuxer->movi_start);
|
||||
demuxer->idx_pos=0;
|
||||
demuxer->idx_pos_a=0;
|
||||
demuxer->idx_pos_v=0;
|
||||
if(demuxer->idx_size>0){
|
||||
// decide index format:
|
||||
if(avi_header.idx[0].dwChunkOffset<avi_header.movi_start)
|
||||
avi_header.idx_offset=avi_header.movi_start-4;
|
||||
if(((AVIINDEXENTRY *)demuxer->idx)[0].dwChunkOffset<demuxer->movi_start)
|
||||
demuxer->idx_offset=demuxer->movi_start-4;
|
||||
else
|
||||
avi_header.idx_offset=0;
|
||||
if(verbose) printf("AVI index offset: %d\n",avi_header.idx_offset);
|
||||
demuxer->idx_offset=0;
|
||||
if(verbose) printf("AVI index offset: %d\n",demuxer->idx_offset);
|
||||
}
|
||||
demuxer->endpos=avi_header.movi_end;
|
||||
// demuxer->endpos=avi_header.movi_end;
|
||||
|
||||
if(avi_header.idx_size>0){
|
||||
if(demuxer->idx_size>0){
|
||||
// check that file is non-interleaved:
|
||||
int i;
|
||||
int a_pos=-1;
|
||||
int v_pos=-1;
|
||||
for(i=0;i<avi_header.idx_size;i++){
|
||||
AVIINDEXENTRY* idx=&avi_header.idx[i];
|
||||
for(i=0;i<demuxer->idx_size;i++){
|
||||
AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)demuxer->idx)[i];
|
||||
demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid);
|
||||
int pos=idx->dwChunkOffset+avi_header.idx_offset;
|
||||
int pos=idx->dwChunkOffset+demuxer->idx_offset;
|
||||
if(a_pos==-1 && ds==demuxer->audio){
|
||||
a_pos=pos;
|
||||
if(v_pos!=-1) break;
|
||||
|
@ -775,8 +781,8 @@ switch(file_format){
|
|||
if(force_ni){
|
||||
printf("Using NON-INTERLEAVED Broken AVI file-format!\n");
|
||||
demuxer->type=DEMUXER_TYPE_AVI_NINI; // HACK!!!!
|
||||
avi_header.idx_pos_a=
|
||||
avi_header.idx_pos_v=avi_header.movi_start;
|
||||
demuxer->idx_pos_a=
|
||||
demuxer->idx_pos_v=demuxer->movi_start;
|
||||
pts_from_bps=1; // force BPS sync!
|
||||
}
|
||||
}
|
||||
|
@ -800,27 +806,27 @@ switch(file_format){
|
|||
sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
|
||||
sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
|
||||
// calculating video bitrate:
|
||||
avi_header.bitrate=avi_header.movi_end-avi_header.movi_start-avi_header.idx_size*8;
|
||||
if(sh_audio) avi_header.bitrate-=sh_audio->audio.dwLength;
|
||||
if(verbose) printf("AVI video length=%d\n",avi_header.bitrate);
|
||||
avi_header.bitrate=((float)avi_header.bitrate/(float)sh_video->video.dwLength)*sh_video->fps;
|
||||
avi_bitrate=demuxer->movi_end-demuxer->movi_start-demuxer->idx_size*8;
|
||||
if(sh_audio) avi_bitrate-=sh_audio->audio.dwLength;
|
||||
if(verbose) printf("AVI video length=%d\n",avi_bitrate);
|
||||
avi_bitrate=((float)avi_bitrate/(float)sh_video->video.dwLength)*sh_video->fps;
|
||||
printf("VIDEO: [%.4s] %dx%d %dbpp %4.2f fps %5.1f kbps (%4.1f kbyte/s)\n",
|
||||
&sh_video->bih->biCompression,
|
||||
sh_video->bih->biWidth,
|
||||
sh_video->bih->biHeight,
|
||||
sh_video->bih->biBitCount,
|
||||
sh_video->fps,
|
||||
avi_header.bitrate*0.008f,
|
||||
avi_header.bitrate/1024.0f );
|
||||
avi_bitrate*0.008f,
|
||||
avi_bitrate/1024.0f );
|
||||
break;
|
||||
}
|
||||
case DEMUXER_TYPE_ASF: {
|
||||
//---- ASF header:
|
||||
read_asf_header();
|
||||
read_asf_header(demuxer);
|
||||
stream_reset(demuxer->stream);
|
||||
stream_seek(demuxer->stream,avi_header.movi_start);
|
||||
avi_header.idx_pos=0;
|
||||
demuxer->endpos=avi_header.movi_end;
|
||||
stream_seek(demuxer->stream,demuxer->movi_start);
|
||||
demuxer->idx_pos=0;
|
||||
// demuxer->endpos=avi_header.movi_end;
|
||||
if(!ds_fill_buffer(d_video)){
|
||||
printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
|
||||
exit(1);
|
||||
|
@ -948,7 +954,7 @@ if(stream_dump_type){
|
|||
f=fopen(stream_dump_name?stream_dump_name:"stream.dump","wb");
|
||||
if(!f){ printf("Can't open dump file!!!\n");exit(1); }
|
||||
while(!ds->eof){
|
||||
char* start;
|
||||
unsigned char* start;
|
||||
int in_size=ds_get_packet(ds,&start);
|
||||
if(in_size>0) fwrite(start,in_size,1,f);
|
||||
}
|
||||
|
@ -1011,7 +1017,7 @@ if(verbose) printf("vo_debug1: out_fmt=0x%08X\n",out_fmt);
|
|||
|
||||
switch(sh_video->codec->driver){
|
||||
case 2: {
|
||||
if(!init_video_codec(out_fmt)) exit(1);
|
||||
if(!init_video_codec(sh_video)) exit(1);
|
||||
if(verbose) printf("INFO: Win32 video codec init OK!\n");
|
||||
break;
|
||||
}
|
||||
|
@ -1439,7 +1445,7 @@ switch(sh_video->codec->driver){
|
|||
unsigned int t=GetTimer();
|
||||
unsigned int t2;
|
||||
DEC_FRAME dec_frame;
|
||||
char* start=NULL;
|
||||
unsigned char* start=NULL;
|
||||
int in_size=ds_get_packet(d_video,&start);
|
||||
if(in_size<0){ eof=1;break;}
|
||||
if(in_size>max_framesize) max_framesize=in_size;
|
||||
|
@ -1461,7 +1467,7 @@ switch(sh_video->codec->driver){
|
|||
}
|
||||
#ifdef USE_DIRECTSHOW
|
||||
case 4: { // W32/DirectShow
|
||||
char* start=NULL;
|
||||
unsigned char* start=NULL;
|
||||
unsigned int t=GetTimer();
|
||||
unsigned int t2;
|
||||
int in_size=ds_get_packet(d_video,&start);
|
||||
|
@ -1489,7 +1495,7 @@ switch(sh_video->codec->driver){
|
|||
#endif
|
||||
case 2: {
|
||||
HRESULT ret;
|
||||
char* start=NULL;
|
||||
unsigned char* start=NULL;
|
||||
unsigned int t=GetTimer();
|
||||
unsigned int t2;
|
||||
int in_size=ds_get_packet(d_video,&start);
|
||||
|
@ -1762,8 +1768,8 @@ switch(sh_video->codec->driver){
|
|||
break;
|
||||
}
|
||||
if(rel_seek_secs)
|
||||
if(file_format==DEMUXER_TYPE_AVI && avi_header.idx_size<=0){
|
||||
printf("Can't seek in raw .AVI streams! (index required) \n");
|
||||
if(file_format==DEMUXER_TYPE_AVI && demuxer->idx_size<=0){
|
||||
printf("Can't seek in raw .AVI streams! (index required, try with the -idx switch!) \n");
|
||||
} else {
|
||||
int skip_audio_bytes=0;
|
||||
float skip_audio_secs=0;
|
||||
|
@ -1795,11 +1801,11 @@ switch(file_format){
|
|||
// find video chunk pos:
|
||||
if(rel_seek_frames>0){
|
||||
// seek forward
|
||||
while(video_chunk_pos<avi_header.idx_size){
|
||||
int id=avi_header.idx[video_chunk_pos].ckid;
|
||||
while(video_chunk_pos<demuxer->idx_size){
|
||||
int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid;
|
||||
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
|
||||
if(avi_stream_id(id)==d_video->id){ // video frame
|
||||
if((--rel_seek_frames)<0 && avi_header.idx[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
|
||||
if((--rel_seek_frames)<0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
|
||||
v_pts+=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
|
||||
++skip_audio_bytes;
|
||||
}
|
||||
|
@ -1808,25 +1814,25 @@ switch(file_format){
|
|||
} else {
|
||||
// seek backward
|
||||
while(video_chunk_pos>=0){
|
||||
int id=avi_header.idx[video_chunk_pos].ckid;
|
||||
int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid;
|
||||
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
|
||||
if(avi_stream_id(id)==d_video->id){ // video frame
|
||||
if((++rel_seek_frames)>0 && avi_header.idx[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
|
||||
if((++rel_seek_frames)>0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
|
||||
v_pts-=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
|
||||
--skip_audio_bytes;
|
||||
}
|
||||
--video_chunk_pos;
|
||||
}
|
||||
}
|
||||
avi_header.idx_pos_a=avi_header.idx_pos_v=
|
||||
avi_header.idx_pos=video_chunk_pos;
|
||||
demuxer->idx_pos_a=demuxer->idx_pos_v=
|
||||
demuxer->idx_pos=video_chunk_pos;
|
||||
// printf("%d frames skipped\n",skip_audio_bytes);
|
||||
|
||||
#if 1
|
||||
// re-calc video pts:
|
||||
avi_video_pts=0;
|
||||
for(i=0;i<video_chunk_pos;i++){
|
||||
int id=avi_header.idx[i].ckid;
|
||||
int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid;
|
||||
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
|
||||
if(avi_stream_id(id)==d_video->id){ // video frame
|
||||
avi_video_pts+=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
|
||||
|
@ -1854,17 +1860,17 @@ switch(file_format){
|
|||
#else
|
||||
curr_audio_pos/=sh_audio->wf->nBlockAlign;
|
||||
curr_audio_pos*=sh_audio->wf->nBlockAlign;
|
||||
avi_header.audio_seekable=1;
|
||||
demuxer->audio_seekable=1;
|
||||
#endif
|
||||
|
||||
// find audio chunk pos:
|
||||
for(i=0;i<video_chunk_pos;i++){
|
||||
int id=avi_header.idx[i].ckid;
|
||||
int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid;
|
||||
//if(TWOCCFromFOURCC(id)==cktypeWAVEbytes){
|
||||
if(avi_stream_id(id)==d_audio->id){
|
||||
int aid=StreamFromFOURCC(id);
|
||||
if(d_audio->id==aid || d_audio->id==-1){
|
||||
len=avi_header.idx[i].dwChunkLength;
|
||||
len=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength;
|
||||
last=i;
|
||||
if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){
|
||||
if(verbose)printf("break;\n");
|
||||
|
@ -1883,8 +1889,8 @@ switch(file_format){
|
|||
// update stream position:
|
||||
d_audio->pos=audio_chunk_pos;
|
||||
d_audio->dpos=apos;
|
||||
avi_header.idx_pos_a=avi_header.idx_pos_v=
|
||||
avi_header.idx_pos=audio_chunk_pos;
|
||||
demuxer->idx_pos_a=demuxer->idx_pos_v=
|
||||
demuxer->idx_pos=audio_chunk_pos;
|
||||
|
||||
if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){
|
||||
#if 0
|
||||
|
@ -1906,9 +1912,9 @@ switch(file_format){
|
|||
|
||||
// calc skip_video_frames & adjust video pts counter:
|
||||
// i=last;
|
||||
i=avi_header.idx_pos;
|
||||
i=demuxer->idx_pos;
|
||||
while(i<video_chunk_pos){
|
||||
int id=avi_header.idx[i].ckid;
|
||||
int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid;
|
||||
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
|
||||
if(avi_stream_id(id)==d_video->id){ // video frame
|
||||
++skip_video_frames;
|
||||
|
@ -1921,16 +1927,16 @@ switch(file_format){
|
|||
}
|
||||
|
||||
if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n",
|
||||
avi_header.idx_pos,audio_chunk_pos,video_chunk_pos,
|
||||
demuxer->idx_pos,audio_chunk_pos,video_chunk_pos,
|
||||
skip_video_frames,skip_audio_bytes,skip_audio_secs);
|
||||
|
||||
// Set OSD:
|
||||
if(osd_level){
|
||||
osd_visible=sh_video->fps; // 1 sec
|
||||
vo_osd_progbar_type=0;
|
||||
vo_osd_progbar_value=(demuxer->filepos)/((avi_header.movi_end-avi_header.movi_start)>>8);
|
||||
vo_osd_progbar_value=(demuxer->filepos)/((demuxer->movi_end-demuxer->movi_start)>>8);
|
||||
//printf("avi filepos = %d \n",vo_osd_progbar_value);
|
||||
// printf("avi filepos = %d (len=%d) \n",demuxer->filepos,(avi_header.movi_end-avi_header.movi_start));
|
||||
// printf("avi filepos = %d (len=%d) \n",demuxer->filepos,(demuxer->movi_end-demuxer->movi_start));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1940,7 +1946,7 @@ switch(file_format){
|
|||
//================= seek in ASF ==========================
|
||||
float p_rate=10; // packets / sec
|
||||
int rel_seek_packs=rel_seek_secs*p_rate;
|
||||
int rel_seek_bytes=rel_seek_packs*fileh.packetsize;
|
||||
int rel_seek_bytes=rel_seek_packs*asf_packetsize;
|
||||
int newpos;
|
||||
//printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration));
|
||||
// printf("ASF_seek: %d secs -> %d packs -> %d bytes \n",
|
||||
|
@ -2057,7 +2063,7 @@ switch(file_format){
|
|||
if(subtitles){
|
||||
if(sub_fps==0) sub_fps=sh_video->fps;
|
||||
current_module="find_sub";
|
||||
find_sub(sub_uses_time?(100*(v_pts+sub_delay)):((v_pts+sub_delay)*sub_fps)); // FIXME! frame counter...
|
||||
find_sub(subtitles,sub_uses_time?(100*(v_pts+sub_delay)):((v_pts+sub_delay)*sub_fps)); // FIXME! frame counter...
|
||||
current_module=NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,7 +33,8 @@ typedef struct {
|
|||
int audio_in_minsize;
|
||||
int audio_out_minsize;
|
||||
// other codecs:
|
||||
ac3_frame_t *ac3_frame;
|
||||
// ac3_frame_t *ac3_frame;
|
||||
void* ac3_frame;
|
||||
int pcm_bswap;
|
||||
} sh_audio_t;
|
||||
|
||||
|
@ -57,4 +58,6 @@ typedef struct {
|
|||
HIC hic; // handle
|
||||
} sh_video_t;
|
||||
|
||||
sh_audio_t* new_sh_audio(int id);
|
||||
sh_video_t* new_sh_video(int id);
|
||||
|
||||
|
|
15
vcd_read.h
15
vcd_read.h
|
@ -1,7 +1,7 @@
|
|||
//=================== VideoCD ==========================
|
||||
static struct cdrom_tocentry vcd_entry;
|
||||
|
||||
void vcd_set_msf(unsigned int sect){
|
||||
static inline void vcd_set_msf(unsigned int sect){
|
||||
vcd_entry.cdte_addr.msf.frame=sect%75;
|
||||
sect=sect/75;
|
||||
vcd_entry.cdte_addr.msf.second=sect%60;
|
||||
|
@ -9,7 +9,7 @@ void vcd_set_msf(unsigned int sect){
|
|||
vcd_entry.cdte_addr.msf.minute=sect;
|
||||
}
|
||||
|
||||
unsigned int vcd_get_msf(){
|
||||
static inline unsigned int vcd_get_msf(){
|
||||
return vcd_entry.cdte_addr.msf.frame +
|
||||
(vcd_entry.cdte_addr.msf.second+
|
||||
vcd_entry.cdte_addr.msf.minute*60)*75;
|
||||
|
@ -20,9 +20,9 @@ int vcd_seek_to_track(int fd,int track){
|
|||
vcd_entry.cdte_track = track;
|
||||
if (ioctl(fd, CDROMREADTOCENTRY, &vcd_entry)) {
|
||||
perror("ioctl dif1");
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
return VCD_SECTOR_DATA*vcd_get_msf();
|
||||
}
|
||||
|
||||
void vcd_read_toc(int fd){
|
||||
|
@ -52,12 +52,9 @@ void vcd_read_toc(int fd){
|
|||
}
|
||||
}
|
||||
|
||||
#define VCD_SECTOR_SIZE 2352
|
||||
#define VCD_SECTOR_OFFS 24
|
||||
#define VCD_SECTOR_DATA 2324
|
||||
static char vcd_buf[VCD_SECTOR_SIZE];
|
||||
|
||||
int vcd_read(int fd,char *mem){
|
||||
static int vcd_read(int fd,char *mem){
|
||||
memcpy(vcd_buf,&vcd_entry.cdte_addr.msf,sizeof(struct cdrom_msf));
|
||||
if(ioctl(fd,CDROMREADRAW,vcd_buf)==-1) return 0; // EOF?
|
||||
|
||||
|
@ -91,7 +88,7 @@ void vcd_cache_init(int s){
|
|||
memset(vcd_cache_sectors,255,s*sizeof(int));
|
||||
}
|
||||
|
||||
void vcd_cache_seek(int sect){
|
||||
static inline void vcd_cache_seek(int sect){
|
||||
vcd_cache_current=sect;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue