summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-18 21:03:59 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-18 21:03:59 +0000
commitcf099b21004558223ed3132dc42d37f5f814541e (patch)
tree1f69aaeaefe8da1ebb4b82bf63be442783c163c0
parentac9465059730747f59b07ad00b5daebbbece8c9f (diff)
downloadmpv-cf099b21004558223ed3132dc42d37f5f814541e.tar.bz2
mpv-cf099b21004558223ed3132dc42d37f5f814541e.tar.xz
muxers now write to output muxer->stream rather than to muxer->file
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@21676 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--libmpcodecs/ae.c1
-rw-r--r--libmpcodecs/ae_faac.c1
-rw-r--r--libmpcodecs/ae_lame.c1
-rw-r--r--libmpcodecs/ae_lavc.c1
-rw-r--r--libmpcodecs/ae_pcm.c1
-rw-r--r--libmpcodecs/ae_toolame.c1
-rw-r--r--libmpcodecs/ae_twolame.c1
-rw-r--r--libmpcodecs/ve_libdv.c1
-rw-r--r--libmpcodecs/ve_nuv.c1
-rw-r--r--libmpcodecs/ve_qtvideo.c1
-rw-r--r--libmpcodecs/ve_raw.c1
-rw-r--r--libmpcodecs/ve_vfw.c1
-rw-r--r--libmpcodecs/ve_x264.c1
-rw-r--r--libmpcodecs/ve_xvid4.c1
-rw-r--r--libmpdemux/muxer.c6
-rw-r--r--libmpdemux/muxer.h4
-rw-r--r--libmpdemux/muxer_avi.c106
-rw-r--r--libmpdemux/muxer_lavf.c22
-rw-r--r--libmpdemux/muxer_mpeg.c22
-rw-r--r--libmpdemux/muxer_rawaudio.c3
-rw-r--r--libmpdemux/muxer_rawvideo.c7
-rw-r--r--mencoder.c27
22 files changed, 121 insertions, 90 deletions
diff --git a/libmpcodecs/ae.c b/libmpcodecs/ae.c
index 85ec1dbda2..e14c8e868b 100644
--- a/libmpcodecs/ae.c
+++ b/libmpcodecs/ae.c
@@ -7,6 +7,7 @@
#include <math.h>
#include "aviheader.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include "ae.h"
#include "config.h"
diff --git a/libmpcodecs/ae_faac.c b/libmpcodecs/ae_faac.c
index efd1e8aaff..1f8f423518 100644
--- a/libmpcodecs/ae_faac.c
+++ b/libmpcodecs/ae_faac.c
@@ -9,6 +9,7 @@
#include "aviheader.h"
#include "libaf/af_format.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include <faac.h>
#include "ae.h"
diff --git a/libmpcodecs/ae_lame.c b/libmpcodecs/ae_lame.c
index aa99972570..f7b74a94b7 100644
--- a/libmpcodecs/ae_lame.c
+++ b/libmpcodecs/ae_lame.c
@@ -8,6 +8,7 @@
#include "mp_msg.h"
#include "aviheader.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include "help_mp.h"
#include "ae_pcm.h"
diff --git a/libmpcodecs/ae_lavc.c b/libmpcodecs/ae_lavc.c
index be909aa26e..ff0172b662 100644
--- a/libmpcodecs/ae_lavc.c
+++ b/libmpcodecs/ae_lavc.c
@@ -8,6 +8,7 @@
#include "mp_msg.h"
#include "aviheader.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include "ae_lavc.h"
#include "help_mp.h"
diff --git a/libmpcodecs/ae_pcm.c b/libmpcodecs/ae_pcm.c
index 02fd04cec7..895fe9623e 100644
--- a/libmpcodecs/ae_pcm.c
+++ b/libmpcodecs/ae_pcm.c
@@ -9,6 +9,7 @@
#include "aviheader.h"
#include "libaf/af_format.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include "ae_pcm.h"
diff --git a/libmpcodecs/ae_toolame.c b/libmpcodecs/ae_toolame.c
index dfc21d92df..aba61db80c 100644
--- a/libmpcodecs/ae_toolame.c
+++ b/libmpcodecs/ae_toolame.c
@@ -9,6 +9,7 @@
#include "aviheader.h"
#include "libaf/af_format.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include "ae_toolame.h"
#include "libmpdemux/mp3_hdr.h"
diff --git a/libmpcodecs/ae_twolame.c b/libmpcodecs/ae_twolame.c
index b42b84ff05..0cf25a0504 100644
--- a/libmpcodecs/ae_twolame.c
+++ b/libmpcodecs/ae_twolame.c
@@ -9,6 +9,7 @@
#include "aviheader.h"
#include "libaf/af_format.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
#include "ae_twolame.h"
#include "libmpdemux/mp3_hdr.h"
diff --git a/libmpcodecs/ve_libdv.c b/libmpcodecs/ve_libdv.c
index 48c2b7fd06..ae61b5eb12 100644
--- a/libmpcodecs/ve_libdv.c
+++ b/libmpcodecs/ve_libdv.c
@@ -13,6 +13,7 @@
#include "demuxer.h"
#include "stheader.h"
+#include "stream.h"
#include "muxer.h"
#include "img_format.h"
diff --git a/libmpcodecs/ve_nuv.c b/libmpcodecs/ve_nuv.c
index 4ed2e20dac..b8da531954 100644
--- a/libmpcodecs/ve_nuv.c
+++ b/libmpcodecs/ve_nuv.c
@@ -12,6 +12,7 @@
#include "demuxer.h"
#include "stheader.h"
+#include "stream.h"
#include "muxer.h"
#include "img_format.h"
diff --git a/libmpcodecs/ve_qtvideo.c b/libmpcodecs/ve_qtvideo.c
index e830156836..bddc70d4a6 100644
--- a/libmpcodecs/ve_qtvideo.c
+++ b/libmpcodecs/ve_qtvideo.c
@@ -25,6 +25,7 @@
#include "demuxer.h"
#include "stheader.h"
+#include "stream.h"
#include "muxer.h"
#include "img_format.h"
diff --git a/libmpcodecs/ve_raw.c b/libmpcodecs/ve_raw.c
index 804266b867..878f4feeab 100644
--- a/libmpcodecs/ve_raw.c
+++ b/libmpcodecs/ve_raw.c
@@ -11,6 +11,7 @@
#include "demuxer.h"
#include "stheader.h"
+#include "stream.h"
#include "muxer.h"
#include "img_format.h"
diff --git a/libmpcodecs/ve_vfw.c b/libmpcodecs/ve_vfw.c
index 16458f012c..965bca3487 100644
--- a/libmpcodecs/ve_vfw.c
+++ b/libmpcodecs/ve_vfw.c
@@ -23,6 +23,7 @@
#include "mp_image.h"
#include "vf.h"
+#include "stream.h"
#include "muxer.h"
//===========================================================================//
diff --git a/libmpcodecs/ve_x264.c b/libmpcodecs/ve_x264.c
index 8fee8d1d8c..c240ad7927 100644
--- a/libmpcodecs/ve_x264.c
+++ b/libmpcodecs/ve_x264.c
@@ -39,6 +39,7 @@
#include "demuxer.h"
#include "stheader.h"
+#include "stream.h"
#include "muxer.h"
#include "img_format.h"
diff --git a/libmpcodecs/ve_xvid4.c b/libmpcodecs/ve_xvid4.c
index 5af21bd7e5..b69103ca0c 100644
--- a/libmpcodecs/ve_xvid4.c
+++ b/libmpcodecs/ve_xvid4.c
@@ -41,6 +41,7 @@
#include "demuxer.h"
#include "stheader.h"
+#include "stream.h"
#include "muxer.h"
#include "img_format.h"
diff --git a/libmpdemux/muxer.c b/libmpdemux/muxer.c
index 3e7537307a..0bb34f5254 100644
--- a/libmpdemux/muxer.c
+++ b/libmpdemux/muxer.c
@@ -11,18 +11,18 @@
#include "aviheader.h"
#include "ms_hdr.h"
-#include "muxer.h"
#include "stream.h"
+#include "muxer.h"
#include "demuxer.h"
#include "mp_msg.h"
#include "help_mp.h"
#include "stheader.h"
-muxer_t *muxer_new_muxer(int type,FILE *f){
+muxer_t *muxer_new_muxer(int type,stream_t *stream){
muxer_t* muxer=calloc(1,sizeof(muxer_t));
if(!muxer)
return NULL;
- muxer->file = f;
+ muxer->stream = stream;
switch (type) {
case MUXER_TYPE_MPEG:
if(! muxer_init_muxer_mpeg(muxer))
diff --git a/libmpdemux/muxer.h b/libmpdemux/muxer.h
index 1dae84ec8e..6770e5d85f 100644
--- a/libmpdemux/muxer.h
+++ b/libmpdemux/muxer.h
@@ -79,12 +79,12 @@ typedef struct muxer_t{
int muxbuf_num;
int muxbuf_skip_buffer;
// functions:
+ stream_t *stream;
void (*fix_stream_parameters)(muxer_stream_t *);
void (*cont_write_chunk)(muxer_stream_t *,size_t,unsigned int, double dts, double pts);
void (*cont_write_header)(struct muxer_t *);
void (*cont_write_index)(struct muxer_t *);
muxer_stream_t* (*cont_new_stream)(struct muxer_t *,int);
- FILE* file;
void *priv;
} muxer_t;
@@ -98,7 +98,7 @@ typedef struct muxbuf_t {
unsigned int flags;
} muxbuf_t;
-muxer_t *muxer_new_muxer(int type,FILE *);
+muxer_t *muxer_new_muxer(int type,stream_t *stream);
#define muxer_new_stream(muxer,a) muxer->cont_new_stream(muxer,a)
#define muxer_stream_fix_parameters(muxer, a) muxer->fix_stream_parameters(a)
void muxer_write_chunk(muxer_stream_t *s, size_t len, unsigned int flags, double dts, double pts);
diff --git a/libmpdemux/muxer_avi.c b/libmpdemux/muxer_avi.c
index 45294325b5..19e3bb6c90 100644
--- a/libmpdemux/muxer_avi.c
+++ b/libmpdemux/muxer_avi.c
@@ -130,19 +130,19 @@ static muxer_stream_t* avifile_new_stream(muxer_t *muxer,int type){
return s;
}
-static void write_avi_chunk(FILE *f,unsigned int id,int len,void* data){
+static void write_avi_chunk(stream_t *stream,unsigned int id,int len,void* data){
int le_len = le2me_32(len);
int le_id = le2me_32(id);
- fwrite(&le_id,4,1,f);
- fwrite(&le_len,4,1,f);
+ stream_write_buffer(stream, &le_id, 4);
+ stream_write_buffer(stream, &le_len, 4);
if(len>0){
if(data){
// DATA
- fwrite(data,len,1,f);
+ stream_write_buffer(stream, data, len);
if(len&1){ // padding
unsigned char zerobyte=0;
- fwrite(&zerobyte,1,1,f);
+ stream_write_buffer(stream, &zerobyte, 1);
}
} else {
// JUNK
@@ -151,20 +151,19 @@ if(len>0){
while(len>0){
int l=strlen(avi_junk_data);
if(l>len) l=len;
- fwrite(avi_junk_data,l,1,f);
+ stream_write_buffer(stream, avi_junk_data, l);
len-=l;
}
}
}
}
-static void write_avi_list(FILE *f,unsigned int id,int len);
+static void write_avi_list(stream_t *s,unsigned int id,int len);
static void avifile_write_standard_index(muxer_t *muxer);
static void avifile_odml_new_riff(muxer_t *muxer)
{
struct avi_stream_info *vsi = muxer->def_v->priv;
- FILE *f = muxer->file;
uint32_t riff[3];
mp_msg(MSGT_MUXER, MSGL_INFO, "ODML: Starting new RIFF chunk at %dMB.\n", (int)(muxer->file_end/1024/1024));
@@ -174,17 +173,17 @@ static void avifile_odml_new_riff(muxer_t *muxer)
vsi->riffofssize+=16;
vsi->riffofs=realloc_struct(vsi->riffofs,(vsi->riffofssize+1),sizeof(off_t));
}
- vsi->riffofs[vsi->riffofspos] = ftello(f);
+ vsi->riffofs[vsi->riffofspos] = stream_tell(muxer->stream);
/* RIFF/AVIX chunk */
riff[0]=le2me_32(mmioFOURCC('R','I','F','F'));
riff[1]=0;
riff[2]=le2me_32(mmioFOURCC('A','V','I','X'));
- fwrite(riff,12,1,f);
+ stream_write_buffer(muxer->stream, riff, 12);
- write_avi_list(f,listtypeAVIMOVIE,0);
+ write_avi_list(muxer->stream,listtypeAVIMOVIE,0);
- muxer->file_end = ftello(f);
+ muxer->file_end = stream_tell(muxer->stream);
}
static void avifile_write_header(muxer_t *muxer);
@@ -197,10 +196,10 @@ static void avifile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags,
int paddedlen = len + (len&1);
if (s->type == MUXER_TYPE_VIDEO && !s->h.dwSuggestedBufferSize) {
- off_t pos=ftell(muxer->file);
- fseek(muxer->file, 0, SEEK_SET);
+ off_t pos=stream_tell(muxer->stream);
+ stream_seek(muxer->stream, 0);
avifile_write_header(muxer);
- fseek(muxer->file, pos, SEEK_SET);
+ stream_seek(muxer->stream, pos);
}
rifflen = muxer->file_end - vsi->riffofs[vsi->riffofspos] - 8;
@@ -238,7 +237,7 @@ static void avifile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags,
++si->idxpos;
// write out the chunk:
- write_avi_chunk(muxer->file,s->ckid,len,s->buffer); /* unsigned char */
+ write_avi_chunk(muxer->stream,s->ckid,len,s->buffer); /* unsigned char */
if (len > s->h.dwSuggestedBufferSize){
s->h.dwSuggestedBufferSize = len;
@@ -248,7 +247,7 @@ static void avifile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags,
muxer->file_end += 8 + paddedlen;
}
-static void write_avi_list(FILE *f,unsigned int id,int len){
+static void write_avi_list(stream_t *stream,unsigned int id,int len){
unsigned int list_id=FOURCC_LIST;
int le_len;
int le_id;
@@ -256,9 +255,9 @@ static void write_avi_list(FILE *f,unsigned int id,int len){
list_id = le2me_32(list_id);
le_len = le2me_32(len);
le_id = le2me_32(id);
- fwrite(&list_id,4,1,f);
- fwrite(&le_len,4,1,f);
- fwrite(&le_id,4,1,f);
+ stream_write_buffer(stream, &list_id, 4);
+ stream_write_buffer(stream, &le_len, 4);
+ stream_write_buffer(stream, &le_id, 4);
}
#define WFSIZE(wf) (sizeof(WAVEFORMATEX)+(wf)->cbSize)
@@ -269,7 +268,6 @@ static void avifile_write_header(muxer_t *muxer){
unsigned int i;
unsigned int hdrsize;
muxer_info_t info[16];
- FILE *f = muxer->file;
VideoPropHeader vprp;
uint32_t aspect = avi_aspect(muxer->def_v);
struct avi_stream_info *vsi = muxer->def_v->priv;
@@ -306,17 +304,17 @@ static void avifile_write_header(muxer_t *muxer){
rifflen = vsi->riffofs[i+1] - vsi->riffofs[i] - 8;
movilen = le2me_32(rifflen - 12);
rifflen = le2me_32(rifflen);
- fseeko(f, vsi->riffofs[i]+4, SEEK_SET);
- fwrite(&rifflen,4,1,f);
+ stream_seek(muxer->stream, vsi->riffofs[i]+4);
+ stream_write_buffer(muxer->stream,&rifflen,4);
/* fixup movi length */
if (i > 0) {
- fseeko(f, vsi->riffofs[i]+16, SEEK_SET);
- fwrite(&movilen,4,1,f);
+ stream_seek(muxer->stream, vsi->riffofs[i]+16);
+ stream_write_buffer(muxer->stream,&movilen,4);
}
}
- fseeko(f, 12, SEEK_SET);
+ stream_seek(muxer->stream, 12);
} else {
// RIFF header:
riff[0]=mmioFOURCC('R','I','F','F');
@@ -325,7 +323,7 @@ static void avifile_write_header(muxer_t *muxer){
riff[0]=le2me_32(riff[0]);
riff[1]=le2me_32(riff[1]);
riff[2]=le2me_32(riff[2]);
- fwrite(&riff,12,1,f);
+ stream_write_buffer(muxer->stream,&riff,12);
}
// update AVI header:
@@ -370,10 +368,10 @@ static void avifile_write_header(muxer_t *muxer){
hdrsize += 32 + 16*si->superidxsize; //indx
}
}
- write_avi_list(f,listtypeAVIHEADER,hdrsize);
+ write_avi_list(muxer->stream,listtypeAVIHEADER,hdrsize);
le2me_MainAVIHeader(&muxer->avih);
- write_avi_chunk(f,ckidAVIMAINHDR,sizeof(muxer->avih),&muxer->avih); /* MainAVIHeader */
+ write_avi_chunk(muxer->stream,ckidAVIMAINHDR,sizeof(muxer->avih),&muxer->avih); /* MainAVIHeader */
le2me_MainAVIHeader(&muxer->avih);
// stream headers:
@@ -416,9 +414,9 @@ static void avifile_write_header(muxer_t *muxer){
break;
}
- write_avi_list(f,listtypeSTREAMHEADER,hdrsize);
+ write_avi_list(muxer->stream,listtypeSTREAMHEADER,hdrsize);
le2me_AVIStreamHeader(&s->h);
- write_avi_chunk(f,ckidSTREAMHEADER,sizeof(s->h),&s->h); /* AVISTreamHeader */ // strh
+ write_avi_chunk(muxer->stream,ckidSTREAMHEADER,sizeof(s->h),&s->h); /* AVISTreamHeader */ // strh
le2me_AVIStreamHeader(&s->h);
switch(s->type){
@@ -426,7 +424,7 @@ static void avifile_write_header(muxer_t *muxer){
{
int biSize=s->bih->biSize;
le2me_BITMAPINFOHEADER(s->bih);
- write_avi_chunk(f,ckidSTREAMFORMAT,biSize,s->bih); /* BITMAPINFOHEADER */
+ write_avi_chunk(muxer->stream,ckidSTREAMFORMAT,biSize,s->bih); /* BITMAPINFOHEADER */
le2me_BITMAPINFOHEADER(s->bih);
if (aspect != 0) {
@@ -434,7 +432,7 @@ static void avifile_write_header(muxer_t *muxer){
le2me_VideoPropHeader(&vprp);
le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[0]);
le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[1]);
- write_avi_chunk(f,mmioFOURCC('v','p','r','p'),
+ write_avi_chunk(muxer->stream,mmioFOURCC('v','p','r','p'),
sizeof(VideoPropHeader) -
sizeof(VIDEO_FIELD_DESC)*(2-fields),
&vprp); /* Video Properties Header */
@@ -445,7 +443,7 @@ static void avifile_write_header(muxer_t *muxer){
{
int wfsize = WFSIZE(s->wf);
le2me_WAVEFORMATEX(s->wf);
- write_avi_chunk(f,ckidSTREAMFORMAT,wfsize,s->wf); /* WAVEFORMATEX */
+ write_avi_chunk(muxer->stream,ckidSTREAMFORMAT,wfsize,s->wf); /* WAVEFORMATEX */
le2me_WAVEFORMATEX(s->wf);
}
break;
@@ -462,7 +460,7 @@ static void avifile_write_header(muxer_t *muxer){
idxhdr[6] = 0;
idxhdr[7] = 0;
- fwrite(idxhdr,sizeof(idxhdr),1,f);
+ stream_write_buffer(muxer->stream,idxhdr,sizeof(idxhdr));
for (j=0; j<n; j++) {
struct avi_odmlsuperidx_entry *entry = &si->superidx[j];
unsigned int data[4];
@@ -470,7 +468,7 @@ static void avifile_write_header(muxer_t *muxer){
data[1] = le2me_32(entry->ofs >> 32);
data[2] = le2me_32(entry->len);
data[3] = le2me_32(entry->duration);
- fwrite(data,sizeof(data),1,f);
+ stream_write_buffer(muxer->stream,data,sizeof(data));
}
}
}
@@ -479,8 +477,8 @@ static void avifile_write_header(muxer_t *muxer){
if (isodml) {
memset(dmlh, 0, sizeof(dmlh));
dmlh[0] = le2me_32(muxer->avih.dwTotalFrames);
- write_avi_list(f,mmioFOURCC('o','d','m','l'),sizeof(dmlh)+8);
- write_avi_chunk(f,mmioFOURCC('d','m','l','h'),sizeof(dmlh),dmlh);
+ write_avi_list(muxer->stream,mmioFOURCC('o','d','m','l'),sizeof(dmlh)+8);
+ write_avi_chunk(muxer->stream,mmioFOURCC('d','m','l','h'),sizeof(dmlh),dmlh);
}
// ============= INFO ===============
@@ -527,27 +525,27 @@ info[i].id=0;
}
// write infos:
if (hdrsize!=0){
- write_avi_list(f,mmioFOURCC('I','N','F','O'),hdrsize);
+ write_avi_list(muxer->stream,mmioFOURCC('I','N','F','O'),hdrsize);
for(i=0;info[i].id!=0;i++) if(info[i].text){
- write_avi_chunk(f,info[i].id,strlen(info[i].text)+1,info[i].text);
+ write_avi_chunk(muxer->stream,info[i].id,strlen(info[i].text)+1,info[i].text);
}
}
// JUNK:
- write_avi_chunk(f,ckidAVIPADDING,MOVIALIGN-(ftello(f)%MOVIALIGN)-8,NULL); /* junk */
+ write_avi_chunk(muxer->stream,ckidAVIPADDING,MOVIALIGN-(stream_tell(muxer->stream)%MOVIALIGN)-8,NULL); /* junk */
if (!isodml) {
// 'movi' header:
- write_avi_list(f,listtypeAVIMOVIE,muxer->movi_end-ftello(f)-12);
+ write_avi_list(muxer->stream,listtypeAVIMOVIE,muxer->movi_end-stream_tell(muxer->stream)-12);
} else {
- if (ftello(f) != MOVIALIGN) {
+ if (stream_tell(muxer->stream) != MOVIALIGN) {
mp_msg(MSGT_MUXER, MSGL_ERR, "Opendml superindex is too big for reserved space!\n");
- mp_msg(MSGT_MUXER, MSGL_ERR, "Expected filepos %d, real filepos %ld, missing space %ld\n", MOVIALIGN, ftell(muxer->file), ftell(muxer->file)-MOVIALIGN);
+ mp_msg(MSGT_MUXER, MSGL_ERR, "Expected filepos %d, real filepos %ld, missing space %ld\n", MOVIALIGN, stream_tell(muxer->stream), stream_tell(muxer->stream)-MOVIALIGN);
mp_msg(MSGT_MUXER, MSGL_ERR, "Try increasing MOVIALIGN in libmpdemux/muxer_avi.c\n");
}
- write_avi_list(f,listtypeAVIMOVIE,muxer->movi_end-ftello(f)-12);
+ write_avi_list(muxer->stream,listtypeAVIMOVIE,muxer->movi_end-stream_tell(muxer->stream)-12);
}
- muxer->movi_start=ftello(muxer->file);
- if (muxer->file_end == 0) muxer->file_end = ftello(muxer->file);
+ muxer->movi_start=stream_tell(muxer->stream);
+ if (muxer->file_end == 0) muxer->file_end = stream_tell(muxer->stream);
}
static void avifile_odml_write_index(muxer_t *muxer){
@@ -619,36 +617,36 @@ static void avifile_odml_write_index(muxer_t *muxer){
idxhdr[7] = 0; /* unused */
si->superidx[j].len = 32 + 8*k;
- si->superidx[j].ofs = ftello(muxer->file);
+ si->superidx[j].ofs = stream_tell(muxer->stream);
si->superidx[j].duration = duration;
- fwrite(idxhdr,sizeof(idxhdr),1,muxer->file);
+ stream_write_buffer(muxer->stream, idxhdr,sizeof(idxhdr));
for (k=0; k<entries_per_subidx && idxpos<si->idxpos; k++) {
unsigned int entry[2];
entry[0] = le2me_32(si->idx[idxpos].ofs - start);
entry[1] = le2me_32(si->idx[idxpos].len | si->idx[idxpos].flags);
idxpos++;
- fwrite(entry,sizeof(entry),1,muxer->file);
+ stream_write_buffer(muxer->stream, entry, sizeof(entry));
}
}
}
- muxer->file_end=ftello(muxer->file);
+ muxer->file_end=stream_tell(muxer->stream);
}
static void avifile_write_standard_index(muxer_t *muxer){
- muxer->movi_end=ftello(muxer->file);
+ muxer->movi_end=stream_tell(muxer->stream);
if(muxer->idx && muxer->idx_pos>0){
int i;
// fixup index entries:
// for(i=0;i<muxer->idx_pos;i++) muxer->idx[i].dwChunkOffset-=muxer->movi_start-4;
// write index chunk:
for (i=0; i<muxer->idx_pos; i++) le2me_AVIINDEXENTRY((&muxer->idx[i]));
- write_avi_chunk(muxer->file,ckidAVINEWINDEX,16*muxer->idx_pos,muxer->idx); /* AVIINDEXENTRY */
+ write_avi_chunk(muxer->stream,ckidAVINEWINDEX,16*muxer->idx_pos,muxer->idx); /* AVIINDEXENTRY */
for (i=0; i<muxer->idx_pos; i++) le2me_AVIINDEXENTRY((&muxer->idx[i]));
muxer->avih.dwFlags|=AVIF_HASINDEX;
}
- muxer->file_end=ftello(muxer->file);
+ muxer->file_end=stream_tell(muxer->stream);
}
static void avifile_write_index(muxer_t *muxer){
diff --git a/libmpdemux/muxer_lavf.c b/libmpdemux/muxer_lavf.c
index e06ff6abe6..17cc80d00a 100644
--- a/libmpdemux/muxer_lavf.c
+++ b/libmpdemux/muxer_lavf.c
@@ -12,8 +12,8 @@
#include "aviheader.h"
#include "ms_hdr.h"
-#include "muxer.h"
#include "stream.h"
+#include "muxer.h"
#include "demuxer.h"
#include "stheader.h"
#include "m_option.h"
@@ -89,14 +89,30 @@ static int mp_read(URLContext *h, unsigned char *buf, int size)
static int mp_write(URLContext *h, unsigned char *buf, int size)
{
muxer_t *muxer = (muxer_t*)h->priv_data;
- return fwrite(buf, 1, size, muxer->file);
+ return stream_write_buffer(muxer->stream, buf, size);
}
static offset_t mp_seek(URLContext *h, offset_t pos, int whence)
{
muxer_t *muxer = (muxer_t*)h->priv_data;
+ if(whence == SEEK_CUR)
+ {
+ off_t cur = stream_tell(muxer->stream);
+ if(cur == -1)
+ return -1;
+ pos += cur;
+ }
+ else if(whence == SEEK_END)
+ {
+ off_t size=0;
+ if(stream_control(muxer->stream, STREAM_CTRL_GET_SIZE, &size) == STREAM_UNSUPORTED || size < pos)
+ return -1;
+ pos = size - pos;
+ }
mp_msg(MSGT_MUXER, MSGL_DBG2, "SEEK %"PRIu64"\n", (int64_t)pos);
- return fseeko(muxer->file, pos, whence);
+ if(!stream_seek(muxer->stream, pos))
+ return -1;
+ return 0;
}
diff --git a/libmpdemux/muxer_mpeg.c b/libmpdemux/muxer_mpeg.c
index a96fc9989a..35d32900ab 100644
--- a/libmpdemux/muxer_mpeg.c
+++ b/libmpdemux/muxer_mpeg.c
@@ -12,8 +12,8 @@
#include "aviheader.h"
#include "ms_hdr.h"
-#include "muxer.h"
#include "stream.h"
+#include "muxer.h"
#include "demuxer.h"
#include "stheader.h"
#include "m_option.h"
@@ -748,7 +748,7 @@ static void write_pes_padding(uint8_t *buff, uint16_t len)
memset(&buff[6], 0xff, len - 6);
}
-static void write_psm_block(muxer_t *muxer, FILE *f)
+static void write_psm_block(muxer_t *muxer, stream_t *stream)
{
uint16_t offset, stuffing_len;
muxer_priv_t *priv = (muxer_priv_t *) muxer->priv;
@@ -763,7 +763,7 @@ static void write_psm_block(muxer_t *muxer, FILE *f)
write_pes_padding(&buff[offset], stuffing_len);
offset += stuffing_len;
}
- fwrite(buff, offset, 1, f);
+ stream_write_buffer(stream, buff, offset);
priv->headers_size += offset;
}
@@ -824,7 +824,7 @@ static uint32_t calc_pes_hlen(int format, muxer_headers_t *h, muxer_priv_t *priv
}
-static int write_mpeg_pack(muxer_t *muxer, muxer_stream_t *s, FILE *f, int isoend)
+static int write_mpeg_pack(muxer_t *muxer, muxer_stream_t *s, stream_t *stream, int isoend)
{
size_t tot, offset;
muxer_priv_t *priv;
@@ -842,7 +842,7 @@ static int write_mpeg_pack(muxer_t *muxer, muxer_stream_t *s, FILE *f, int isoen
buff[offset + 2] = 1;
buff[offset + 3] = 0xb9;
- fwrite(buff, priv->packet_size, 1, f);
+ stream_write_buffer(stream, buff, priv->packet_size);
return 1;
}
else //FAKE DVD NAV PACK
@@ -863,7 +863,7 @@ static int write_mpeg_pack(muxer_t *muxer, muxer_stream_t *s, FILE *f, int isoen
offset += stuffing_len;
}
- fwrite(buff, offset, 1, f);
+ stream_write_buffer(stream, buff, offset);
priv->headers_size += offset;
tot = offset;
muxer->movi_end += tot;
@@ -1240,7 +1240,7 @@ static int fill_packet(muxer_t *muxer, muxer_stream_t *s, int finalize)
spriv->size += len;
if(dvd_pack && (spriv->pack_offset == priv->packet_size))
- write_mpeg_pack(muxer, NULL, muxer->file, 0); //insert fake Nav Packet
+ write_mpeg_pack(muxer, NULL, muxer->stream, 0); //insert fake Nav Packet
if(n > 0)
remove_frames(spriv, n);
@@ -1259,7 +1259,7 @@ static int fill_packet(muxer_t *muxer, muxer_stream_t *s, int finalize)
spriv->pack_offset += diff;
}
- fwrite(spriv->pack, spriv->pack_offset, 1, muxer->file);
+ stream_write_buffer(muxer->stream, spriv->pack, spriv->pack_offset);
priv->headers_size += spriv->pack_offset - len;
priv->data_size += len;
@@ -2351,7 +2351,7 @@ static void mpegfile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags
spriv->psm_fixed = 1;
priv->psm_streams_cnt++;
if((priv->psm_streams_cnt == muxer->num_videos + muxer->num_audios) && priv->use_psm)
- write_psm_block(muxer, muxer->file);
+ write_psm_block(muxer, muxer->stream);
}
flush_buffers(muxer, 0);
@@ -2374,7 +2374,7 @@ static void mpegfile_write_index(muxer_t *muxer)
while(flush_buffers(muxer, 0) > 0);
flush_buffers(muxer, 1);
if(priv->is_genmpeg1 || priv->is_genmpeg2)
- write_mpeg_pack(muxer, NULL, muxer->file, 1); //insert fake Nav Packet
+ write_mpeg_pack(muxer, NULL, muxer->stream, 1); //insert fake Nav Packet
mp_msg(MSGT_MUXER, MSGL_INFO, "\nOverhead: %.3lf%% (%"PRIu64" / %"PRIu64")\n", 100.0 * (double)priv->headers_size / (double)priv->data_size, priv->headers_size, priv->data_size);
}
@@ -2400,7 +2400,7 @@ static void mpegfile_write_header(muxer_t *muxer)
//write the first system header only for generic mpeg1/2 muxes, and only when we have collected all necessary infos
if(priv->is_genmpeg1 || priv->is_genmpeg2 || ((priv->is_xvcd || priv->is_xsvcd) && (priv->headers_cnt == 1)))
{
- write_mpeg_pack(muxer, NULL, muxer->file, 0);
+ write_mpeg_pack(muxer, NULL, muxer->stream, 0);
priv->update_system_header = 0;
}
diff --git a/libmpdemux/muxer_rawaudio.c b/libmpdemux/muxer_rawaudio.c
index a7132d227b..f839707380 100644
--- a/libmpdemux/muxer_rawaudio.c
+++ b/libmpdemux/muxer_rawaudio.c
@@ -9,6 +9,7 @@
#include "aviheader.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
static muxer_stream_t* rawaudiofile_new_stream(muxer_t *muxer,int type){
@@ -50,7 +51,7 @@ static void rawaudiofile_write_chunk(muxer_stream_t *s,size_t len,unsigned int f
// write out the chunk:
if (s->type==MUXER_TYPE_AUDIO)
- fwrite(s->buffer,len,1,muxer->file);
+ stream_write_buffer(muxer->stream, s->buffer, len);
}
static void rawaudiofile_write_header(muxer_t *muxer){
diff --git a/libmpdemux/muxer_rawvideo.c b/libmpdemux/muxer_rawvideo.c
index b12a0ef1ac..8f2f4b29f3 100644
--- a/libmpdemux/muxer_rawvideo.c
+++ b/libmpdemux/muxer_rawvideo.c
@@ -14,6 +14,7 @@
#include "aviheader.h"
#include "ms_hdr.h"
+#include "stream.h"
#include "muxer.h"
static muxer_stream_t* rawvideofile_new_stream(muxer_t *muxer,int type){
@@ -39,11 +40,11 @@ static muxer_stream_t* rawvideofile_new_stream(muxer_t *muxer,int type){
return s;
}
-static void write_rawvideo_chunk(FILE *f,int len,void* data){
+static void write_rawvideo_chunk(stream_t *stream,int len,void* data){
if(len>0){
if(data){
// DATA
- fwrite(data,len,1,f);
+ stream_write_buffer(stream,data,len);
}
}
}
@@ -53,7 +54,7 @@ static void rawvideofile_write_chunk(muxer_stream_t *s,size_t len,unsigned int f
// write out the chunk:
if (s->type == MUXER_TYPE_VIDEO)
- write_rawvideo_chunk(muxer->file,len,s->buffer); /* unsigned char */
+ write_rawvideo_chunk(muxer->stream,len,s->buffer); /* unsigned char */
// if((unsigned int)len>s->h.dwSuggestedBufferSize) s->h.dwSuggestedBufferSize=len;
diff --git a/mencoder.c b/mencoder.c
index ecec996a6d..449111a5aa 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -359,13 +359,13 @@ static void exit_sighandler(int x){
}
static muxer_t* muxer=NULL;
-static FILE* muxer_f=NULL;
extern void print_wave_header(WAVEFORMATEX *h, int verbose_level);
int main(int argc,char* argv[]){
stream_t* stream=NULL;
+stream_t* ostream=NULL;
demuxer_t* demuxer=NULL;
stream_t* stream2=NULL;
demuxer_t* demuxer2=NULL;
@@ -402,6 +402,7 @@ int decoded_frameno=0;
int next_frameno=-1;
int curfile=0;
int new_srate=0;
+int fformat=DEMUXER_TYPE_UNKNOWN;
unsigned int timer_start=0;
ao_data_t ao_data = {0,0,0,0,OUTBURST,-1,0};
@@ -713,17 +714,13 @@ vo_spudec=spudec_new_scaled(stream->type==STREAMTYPE_DVD?((dvd_priv_t *)(stream-
// Apply current settings for forced subs
spudec_set_forced_subs_only(vo_spudec,forced_subs_only);
-// set up output file:
-if(!strcmp(out_filename, "-"))
- muxer_f=stdout;
-else
- muxer_f=fopen(out_filename,"wb");
-if(!muxer_f) {
+ostream = open_output_stream(out_filename, 0);
+if(!ostream) {
mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CannotOpenOutputFile, out_filename);
mencoder_exit(1,NULL);
}
-muxer=muxer_new_muxer(out_file_format,muxer_f);
+muxer=muxer_new_muxer(out_file_format,ostream);
if(!muxer) {
mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CannotInitializeMuxer);
mencoder_exit(1,NULL);
@@ -1092,7 +1089,7 @@ while(!at_eof){
float v_pts=0;
int skip_flag=0; // 1=skip -1=duplicate
- if((end_at.type == END_AT_SIZE && end_at.pos <= ftello(muxer_f)) ||
+ if((end_at.type == END_AT_SIZE && end_at.pos <= stream_tell(muxer->stream)) ||
(end_at.type == END_AT_TIME && end_at.pos < mux_v->timer))
break;
@@ -1451,7 +1448,7 @@ if(sh_audio && !demux