mirror of
https://github.com/mpv-player/mpv
synced 2025-03-25 04:38:01 +00:00
patch adds support for MOV-Reference-Files.
it uses d_video queue to store playlist entries as strz. It also makes sure, that unnecessary items like qt5gateQT are removed and that the url/basepath is added to "local files" by Fabian Franz <FabianFranz@gmx.de> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8938 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
57b2503b00
commit
1e166db202
@ -356,6 +356,8 @@ int mov_check_file(demuxer_t* demuxer){
|
|||||||
int ref=0;
|
int ref=0;
|
||||||
skipped+=i;
|
skipped+=i;
|
||||||
mp_msg(MSGT_DEMUX,MSGL_INFO,"MOV: Reference Media file!!!\n");
|
mp_msg(MSGT_DEMUX,MSGL_INFO,"MOV: Reference Media file!!!\n");
|
||||||
|
//set demuxer type to playlist ...
|
||||||
|
demuxer->type=DEMUXER_TYPE_PLAYLIST;
|
||||||
while(i>0){
|
while(i>0){
|
||||||
int len=stream_read_dword(demuxer->stream)-8;
|
int len=stream_read_dword(demuxer->stream)-8;
|
||||||
int fcc=stream_read_dword(demuxer->stream);
|
int fcc=stream_read_dword(demuxer->stream);
|
||||||
@ -369,10 +371,21 @@ int mov_check_file(demuxer_t* demuxer){
|
|||||||
int tmp=stream_read_dword(demuxer->stream);
|
int tmp=stream_read_dword(demuxer->stream);
|
||||||
int type=stream_read_dword_le(demuxer->stream);
|
int type=stream_read_dword_le(demuxer->stream);
|
||||||
int slen=stream_read_dword(demuxer->stream);
|
int slen=stream_read_dword(demuxer->stream);
|
||||||
char* s=malloc(slen+1);
|
//char* s=malloc(slen+1);
|
||||||
stream_read(demuxer->stream,s,slen);
|
//stream_read(demuxer->stream,s,slen);
|
||||||
s[slen]=0;
|
|
||||||
mp_msg(MSGT_DEMUX,MSGL_INFO,"REF: [%.4s] %s\n",&type,s);
|
//FIXME: also store type & data_rate ?
|
||||||
|
ds_read_packet(demuxer->video,
|
||||||
|
demuxer->stream,
|
||||||
|
slen,
|
||||||
|
0,
|
||||||
|
stream_tell(demuxer->stream),
|
||||||
|
0 // no flags
|
||||||
|
);
|
||||||
|
flags|=4;
|
||||||
|
mp_msg(MSGT_DEMUX,MSGL_V,"Added reference to playlist\n");
|
||||||
|
//s[slen]=0;
|
||||||
|
//mp_msg(MSGT_DEMUX,MSGL_INFO,"REF: [%.4s] %s\n",&type,s);
|
||||||
len-=12+slen;i-=12+slen; break;
|
len-=12+slen;i-=12+slen; break;
|
||||||
}
|
}
|
||||||
case MOV_FOURCC('r','m','d','r'): {
|
case MOV_FOURCC('r','m','d','r'): {
|
||||||
@ -434,6 +447,9 @@ skip_chunk:
|
|||||||
}
|
}
|
||||||
free(priv);
|
free(priv);
|
||||||
|
|
||||||
|
if (flags==5) // reference & header sent
|
||||||
|
return 1;
|
||||||
|
|
||||||
if(flags==1)
|
if(flags==1)
|
||||||
mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing data (mdat) chunk! Maybe broken file...\n");
|
mp_msg(MSGT_DEMUX,MSGL_WARN,"MOV: missing data (mdat) chunk! Maybe broken file...\n");
|
||||||
else if(flags==2)
|
else if(flags==2)
|
||||||
|
@ -650,7 +650,7 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MOV){
|
|||||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_MOV,audio_id,video_id,dvdsub_id);
|
demuxer=new_demuxer(stream,DEMUXER_TYPE_MOV,audio_id,video_id,dvdsub_id);
|
||||||
if(mov_check_file(demuxer)){
|
if(mov_check_file(demuxer)){
|
||||||
mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"QuickTime/MOV");
|
mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"QuickTime/MOV");
|
||||||
file_format=DEMUXER_TYPE_MOV;
|
file_format=demuxer->type;
|
||||||
} else {
|
} else {
|
||||||
free_demuxer(demuxer);
|
free_demuxer(demuxer);
|
||||||
demuxer = NULL;
|
demuxer = NULL;
|
||||||
|
56
mplayer.c
56
mplayer.c
@ -585,6 +585,8 @@ static int libmpdemux_was_interrupted(int eof) {
|
|||||||
return eof;
|
return eof;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define mp_basename(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1))
|
||||||
|
|
||||||
int playtree_add_playlist(play_tree_t* entry)
|
int playtree_add_playlist(play_tree_t* entry)
|
||||||
{
|
{
|
||||||
if(!entry) {
|
if(!entry) {
|
||||||
@ -1226,6 +1228,60 @@ if(stream_cache_size>0){
|
|||||||
current_module="demux_open";
|
current_module="demux_open";
|
||||||
|
|
||||||
demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id);
|
demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id);
|
||||||
|
|
||||||
|
// HACK to get MOV Reference Files working
|
||||||
|
|
||||||
|
if (demuxer && demuxer->type==DEMUXER_TYPE_PLAYLIST)
|
||||||
|
{
|
||||||
|
unsigned char* playlist_entry;
|
||||||
|
play_tree_t *list = NULL, *entry = NULL;
|
||||||
|
|
||||||
|
current_module="handle_demux_playlist";
|
||||||
|
while (ds_get_packet(demuxer->video,&playlist_entry)>0)
|
||||||
|
{
|
||||||
|
char *temp, *bname;
|
||||||
|
|
||||||
|
mp_msg(MSGT_CPLAYER,MSGL_V,"Adding file %s to element entry\n",playlist_entry);
|
||||||
|
|
||||||
|
bname=mp_basename(playlist_entry);
|
||||||
|
if ((strlen(bname)>10) && !strncmp(bname,"qt",2) && !strncmp(bname+3,"gateQT",6))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
entry = play_tree_new();
|
||||||
|
|
||||||
|
if (filename && !strcmp(mp_basename(playlist_entry),playlist_entry)) // add reference path of current file
|
||||||
|
{
|
||||||
|
temp=malloc((strlen(filename)-strlen(mp_basename(filename))+strlen(playlist_entry)+1)*sizeof(char));
|
||||||
|
if (temp)
|
||||||
|
{
|
||||||
|
strncpy(temp, filename, strlen(filename)-strlen(mp_basename(filename)));
|
||||||
|
temp[strlen(filename)-strlen(mp_basename(filename))]='\0';
|
||||||
|
strcat(temp, playlist_entry);
|
||||||
|
play_tree_add_file(entry,temp);
|
||||||
|
mp_msg(MSGT_CPLAYER,MSGL_V,"Resolving reference to %s\n",temp);
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
play_tree_add_file(entry,playlist_entry);
|
||||||
|
|
||||||
|
if(!list)
|
||||||
|
list = entry;
|
||||||
|
else
|
||||||
|
play_tree_append_entry(list,entry);
|
||||||
|
}
|
||||||
|
free_demuxer(demuxer);
|
||||||
|
demuxer = NULL;
|
||||||
|
|
||||||
|
if (list)
|
||||||
|
{
|
||||||
|
entry = play_tree_new();
|
||||||
|
play_tree_set_child(entry,list);
|
||||||
|
eof=playtree_add_playlist(entry);
|
||||||
|
goto goto_next_file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!demuxer)
|
if(!demuxer)
|
||||||
{
|
{
|
||||||
play_tree_t* entry;
|
play_tree_t* entry;
|
||||||
|
Loading…
Reference in New Issue
Block a user