📄 stream_file.c
字号:
#include "config.h"//#include <mplaylib.h>#include <sys/types.h>#include <sys/stat.h>#include "mp_msg.h"#include "stream.h"#include "help_mp.h"#include "m_option.h"#include "m_struct.h"static struct stream_priv_s { char* filename; char *filename2;} stream_priv_dflts = { NULL, NULL};extern FS_FILE * BUFF_Open ( const char *pFileName, const char *pMode );extern int BUFF_GetFileSize(FS_FILE * fp);extern unsigned int BUFF_DirectRead(int fp,char **buf,int len);extern int BUFF_Seek (FS_FILE * fp, long Offset, int Whence );extern void BUFF_Close( FS_FILE * PORT );#define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)/// URL definitionstatic m_option_t stream_opts_fields[] = { {"string", ST_OFF(filename), CONF_TYPE_STRING, 0, 0 ,0, NULL}, {"filename", ST_OFF(filename2), CONF_TYPE_STRING, 0, 0 ,0, NULL}, { NULL, NULL, 0, 0, 0, 0, NULL }};static struct m_struct_st stream_opts = { "file", sizeof(struct stream_priv_s), &stream_priv_dflts, stream_opts_fields}; #define mplayread(x,y,z) BUFF_DirectRead(x,y,z) static int fill_buffer(stream_t *s, char** buffer, int max_len){ int r = mplayread(s->fd,buffer,max_len); return (r <= 0) ? -1 : r;}static int write_buffer(stream_t *s, char* buffer, int len) { int r = write(s->fd,buffer,len); return (r <= 0) ? -1 : r;}static int seek(stream_t *s,off_t newpos) { s->pos = newpos; if(BUFF_Seek(s->fd,s->pos,SEEK_SET)<0) { s->eof=1; return 0; } return 1;}static int seek_forward(stream_t *s,off_t newpos) { if(newpos<s->pos){ mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); return 0; } while(s->pos<newpos){ int len=s->fill_buffer(s,&(s->pBuffer),STREAM_BUFFER_SIZE); if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; break; } // EOF s->buf_pos=0; s->buf_len=len; s->pos+=len; } return 1;}static void close_f(stream_t *s){ F("\n"); BUFF_Close(s->fd); //close(s->fd); F("\n");}static int control(stream_t *s, int cmd, void *arg) { switch(cmd) { case STREAM_CTRL_GET_SIZE: { off_t size; size = BUFF_Seek(s->fd, 0, SEEK_END); BUFF_Seek(s->fd, s->pos, SEEK_SET); if(size != (off_t)-1) { *((off_t*)arg) = size; return 1; } case STREAM_CTRL_RESET: F("reset;\n"); s->pos = 0; BUFF_Seek(s->fd, 0, SEEK_SET); return 1; } } return STREAM_UNSUPPORTED;}static int open_f(stream_t *stream,int mode, void* opts, int* file_format) { int f; mode_t m = 0; off_t len; unsigned char *filename; struct stream_priv_s* p = (struct stream_priv_s*)opts; char rmode[12]; if(mode == STREAM_READ) strcpy(rmode,"rb"); else if(mode == STREAM_WRITE) strcpy(rmode,"wb"); else { mp_msg(MSGT_OPEN,MSGL_ERR, "[file] Unknown open mode %d\n",mode); m_struct_free(&stream_opts,opts); return STREAM_UNSUPPORTED; } if(p->filename) filename = p->filename; else if(p->filename2) filename = p->filename2; else filename = NULL; if(!filename) { mp_msg(MSGT_OPEN,MSGL_ERR, "[file] No filename\n"); m_struct_free(&stream_opts,opts); return STREAM_ERROR; } f=BUFF_Open(filename,rmode); if(f==0) { mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename); m_struct_free(&stream_opts,opts); return STREAM_ERROR; } len = BUFF_GetFileSize(f); //len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); if(len == -1) { if(mode == STREAM_READ) stream->seek = seek_forward; stream->type = STREAMTYPE_STREAM; // Must be move to STREAMTYPE_FILE stream->flags |= STREAM_SEEK_FW; } else if(len >= 0) { stream->seek = seek; stream->end_pos = len; stream->type = STREAMTYPE_FILE; } mp_msg(MSGT_OPEN,MSGL_V,"[file] File size is %"PRId64" bytes\n", (int64_t)len); stream->fd = f; stream->fill_buffer = fill_buffer; stream->write_buffer = NULL; stream->control = control; stream->close = close_f; m_struct_free(&stream_opts,opts); return STREAM_OK;}stream_info_t stream_info_file = { "File", "file", "Albeu", "based on the code from ??? (probably Arpi)", open_f, { "file", "", NULL }, &stream_opts, 1 // Urls are an option string};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -