[Mplayerxp-cvslog] CVS: mplayerxp/mplayerxp/libmpdemux mux_raw.c,NONE,1.1 demux_lavf.c,1.1,1.2 Makef
Brought to you by:
olov
Update of /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22071 Modified Files: demux_lavf.c Makefile muxer.c muxer.h mux_lavf.c mux_mpxp64.c Added Files: mux_raw.c Removed Files: mux_asf.c mux_avi.c mux_mpeg.c Log Message: finalize dump redesign --- NEW FILE: mux_raw.c --- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <inttypes.h> #include <unistd.h> #include "config.h" #include "../version.h" //#include "stream.h" //#include "demuxer.h" //#include "stheader.h" #include "wine/mmreg.h" #include "wine/avifmt.h" #include "wine/vfw.h" #include "bswap.h" #include "muxer.h" #include "aviheader.h" #include "demux_msg.h" typedef struct priv_raw_stream_s { uint32_t ckid; // chunk id (00dc 01wb etc) }priv_raw_stream_t; static muxer_stream_t* rawfile_new_stream(muxer_t *muxer,int type){ muxer_stream_t* s; if (!muxer) return NULL; if(muxer->avih.dwStreams>=MUXER_MAX_STREAMS){ MSG_ERR("Too many streams! increase MUXER_MAX_STREAMS !\n"); return NULL; } s=malloc(sizeof(muxer_stream_t)); memset(s,0,sizeof(muxer_stream_t)); if(!s) return NULL; // no mem!? muxer->streams[muxer->avih.dwStreams]=s; s->type=type; s->id=muxer->avih.dwStreams; s->timer=0.0; s->muxer=muxer; s->priv=malloc(sizeof(priv_raw_stream_t)); memset(s->priv,0,sizeof(priv_raw_stream_t)); s->size=0; switch(type){ case MUXER_TYPE_VIDEO: ((priv_raw_stream_t *)s->priv)->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'d','c'); s->h.fccType=streamtypeVIDEO; if(!muxer->def_v) muxer->def_v=s; break; case MUXER_TYPE_AUDIO: ((priv_raw_stream_t *)s->priv)->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'w','b'); s->h.fccType=streamtypeAUDIO; break; case MUXER_TYPE_SUBS: ((priv_raw_stream_t *)s->priv)->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'t','x'); break; default: MSG_WARN("WarninG! unknown stream type: %d\n",type); return NULL; } muxer->avih.dwStreams++; return s; } static void rawfile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags,float pts){ muxer_t *muxer=s->muxer; fwrite(s->buffer,len,1,muxer->file); } static void rawfile_write_header(muxer_t *muxer,demuxer_t*dinfo){ } static void rawfile_write_index(muxer_t *muxer){ } void muxer_init_muxer_raw(muxer_t *muxer){ muxer->cont_new_stream = &rawfile_new_stream; muxer->cont_write_chunk = &rawfile_write_chunk; muxer->cont_write_header = &rawfile_write_header; muxer->cont_write_index = &rawfile_write_index; } Index: demux_lavf.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/demux_lavf.c,v retrieving revision 1.1 retrieving revision 1.2 diff -p -u -d -r1.1 -r1.2 --- demux_lavf.c 17 Feb 2006 10:48:35 -0000 1.1 +++ demux_lavf.c 20 Feb 2006 18:17:33 -0000 1.2 @@ -300,7 +300,6 @@ static demuxer_t* lavf_open(demuxer_t *d sh_audio->format = 0x7; break; default: - sh_audio->format = 0x1; break; } if(verbose>=1) print_wave_header(sh_audio->wf); Index: Makefile =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/Makefile,v retrieving revision 1.28 retrieving revision 1.29 diff -p -u -d -r1.28 -r1.29 --- Makefile 17 Feb 2006 10:48:35 -0000 1.28 +++ Makefile 20 Feb 2006 18:17:33 -0000 1.29 @@ -18,7 +18,7 @@ SRCS += mpdemux.c demux_ogg.c demux_bmp. SRCS += demux_pva.c demux_rawvideo.c demux_smjpeg.c demux_ts.c demux_nsv.c demux_mkv.c SRCS += demux_mpxp64.c demux_lavf.c -SRCS += muxer.c mux_avi.c mux_mpeg.c mux_asf.c mux_mpxp64.c mux_lavf.c +SRCS += muxer.c mux_mpxp64.c mux_lavf.c mux_raw.c ifeq ($(STREAMING),yes) SRCS += asf_streaming.c asf_mmst_streaming.c url.c http.c network.c rtp.c pnm.c endif Index: muxer.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/muxer.c,v retrieving revision 1.4 retrieving revision 1.5 diff -p -u -d -r1.4 -r1.5 --- muxer.c 17 Feb 2006 10:48:35 -0000 1.4 +++ muxer.c 20 Feb 2006 18:17:33 -0000 1.5 @@ -14,26 +14,15 @@ #include "muxer.h" -muxer_t *muxer_new_muxer(int type,FILE *f){ +muxer_t *muxer_new_muxer(const char *type,const char *subtype,FILE *f){ muxer_t* muxer=malloc(sizeof(muxer_t)); memset(muxer,0,sizeof(muxer_t)); muxer->file = f; - switch (type) { - case MUXER_TYPE_LAVF: - muxer_init_muxer_lavf(muxer); - break; - case MUXER_TYPE_MPXP64: - muxer_init_muxer_mpxp64(muxer); - break; - case MUXER_TYPE_ASF: - muxer_init_muxer_asf(muxer); - break; - case MUXER_TYPE_MPEG: - muxer_init_muxer_mpeg(muxer); - break; - case MUXER_TYPE_AVI: - default: - muxer_init_muxer_avi(muxer); - } + if(!strcmp(type,"lavf")) { if(!muxer_init_muxer_lavf(muxer,subtype)) { free(muxer); muxer=NULL; }} + else + if(!strcmp(type,"mpxp")) muxer_init_muxer_mpxp64(muxer); + else + if(!strcmp(type,"raw")) muxer_init_muxer_raw(muxer); + else { free(muxer); muxer=NULL; } return muxer; } Index: muxer.h =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/muxer.h,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- muxer.h 17 Feb 2006 10:48:35 -0000 1.9 +++ muxer.h 20 Feb 2006 18:17:33 -0000 1.10 @@ -3,12 +3,11 @@ #define MUXER_TYPE_VIDEO 0 #define MUXER_TYPE_AUDIO 1 +#define MUXER_TYPE_SUBS 2 -#define MUXER_TYPE_AVI 0 -#define MUXER_TYPE_MPEG 1 -#define MUXER_TYPE_ASF 2 -#define MUXER_TYPE_MPXP64 3 -#define MUXER_TYPE_LAVF 4 +#define MUXER_TYPE_RAW 0 +#define MUXER_TYPE_MPXP64 1 +#define MUXER_TYPE_LAVF 2 #define MUXER_MPEG_BLOCKSIZE 2048 // 2048 or 2324 - ? @@ -80,6 +79,7 @@ typedef struct muxer_t{ MainAVIHeader avih; muxer_stream_t* def_v; // default video stream (for general headers) muxer_stream_t* streams[MUXER_MAX_STREAMS]; + void (*fix_parameters)(struct muxer_t *); void (*cont_write_chunk)(muxer_stream_t *,size_t,unsigned int flags, float pts); void (*cont_write_header)(struct muxer_t *,demuxer_t *dinfo); void (*cont_write_index)(struct muxer_t *); @@ -88,14 +88,13 @@ typedef struct muxer_t{ void *priv; } muxer_t; -muxer_t *muxer_new_muxer(int type,FILE *); +muxer_t *muxer_new_muxer(const char *type,const char *subtype,FILE *f); #define muxer_new_stream(muxer,a) muxer->cont_new_stream(muxer,a) #define muxer_write_chunk(a,b,c,d) a->muxer->cont_write_chunk(a,b,c,d) -#define muxer_write_header(muxer,info) muxer->cont_write_header(muxer,info) -#define muxer_write_index(muxer) muxer->cont_write_index(muxer) +#define muxer_write_header(muxer,info) if(muxer->cont_write_header) muxer->cont_write_header(muxer,info) +#define muxer_write_index(muxer) if(muxer->cont_write_index) muxer->cont_write_index(muxer) +#define muxer_fix_parameters(muxer) if(muxer->fix_parameters) muxer->fix_parameters(muxer) -extern void muxer_init_muxer_asf(muxer_t *); -extern void muxer_init_muxer_avi(muxer_t *); -extern void muxer_init_muxer_mpeg(muxer_t *); +extern void muxer_init_muxer_raw(muxer_t *); extern void muxer_init_muxer_mpxp64(muxer_t *); -extern void muxer_init_muxer_lavf(muxer_t *); +extern int muxer_init_muxer_lavf(muxer_t *,const char *); Index: mux_lavf.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/mux_lavf.c,v retrieving revision 1.1 retrieving revision 1.2 diff -p -u -d -r1.1 -r1.2 --- mux_lavf.c 17 Feb 2006 10:48:35 -0000 1.1 +++ mux_lavf.c 20 Feb 2006 18:17:33 -0000 1.2 @@ -63,6 +63,8 @@ static AVStream *(*av_new_stream_ptr)(AV #define av_new_stream(a,b) (*av_new_stream_ptr)(a,b) static int (*av_interleaved_write_frame_ptr)(AVFormatContext *s, AVPacket *pkt); #define av_interleaved_write_frame(a,b) (*av_interleaved_write_frame_ptr)(a,b) +static int (*av_write_frame_ptr)(AVFormatContext *s, AVPacket *pkt); +#define av_write_frame(a,b) (*av_write_frame_ptr)(a,b) static int (*av_write_header_ptr)(AVFormatContext *s); #define av_write_header(a) (*av_write_header_ptr)(a) static int (*av_write_trailer_ptr)(AVFormatContext *s); @@ -82,6 +84,10 @@ static int (*av_set_parameters_ptr)(AVFo #define av_set_parameters(a,b) (*av_set_parameters_ptr)(a,b) static int (*register_protocol_ptr)(URLProtocol *protocol); #define register_protocol(a) (*register_protocol_ptr)(a) +static enum CodecID (*codec_get_bmp_id_ptr)(unsigned int tag); +#define codec_get_bmp_id(a) (*codec_get_bmp_id_ptr)(a) +static enum CodecID (*codec_get_wav_id_ptr)(unsigned int tag); +#define codec_get_wav_id(a) (*codec_get_wav_id_ptr)(a) static void *dll_handle; @@ -92,6 +98,7 @@ static int load_dll(const char *libname) av_new_stream_ptr = ld_sym(dll_handle,"av_new_stream"); av_destruct_packet_nofree_ptr = ld_sym(dll_handle,"av_destruct_packet_nofree"); av_interleaved_write_frame_ptr = ld_sym(dll_handle,"av_interleaved_write_frame"); + av_write_frame_ptr = ld_sym(dll_handle,"av_write_frame"); av_write_header_ptr = ld_sym(dll_handle,"av_write_header"); av_write_trailer_ptr = ld_sym(dll_handle,"av_write_trailer"); url_fclose_ptr = ld_sym(dll_handle,"url_fclose"); @@ -100,15 +107,16 @@ static int load_dll(const char *libname) guess_format_ptr = ld_sym(dll_handle,"guess_format"); av_set_parameters_ptr = ld_sym(dll_handle,"av_set_parameters"); register_protocol_ptr = ld_sym(dll_handle,"register_protocol"); + codec_get_bmp_id_ptr = ld_sym(dll_handle,"codec_get_bmp_id"); + codec_get_wav_id_ptr = ld_sym(dll_handle,"codec_get_wav_id"); return av_register_all_ptr && av_new_stream_ptr && url_fopen_ptr && av_destruct_packet_nofree_ptr && av_interleaved_write_frame_ptr && av_write_header_ptr && av_write_trailer_ptr && url_fclose_ptr && av_alloc_format_context_ptr && guess_format_ptr && - av_set_parameters_ptr && register_protocol_ptr; + av_set_parameters_ptr && register_protocol_ptr && av_write_frame_ptr && + codec_get_bmp_id_ptr && codec_get_wav_id_ptr; } -static char *conf_format = NULL; -static int conf_allow_lavf = 0; static int mux_rate= 0; static int mux_packet_size= 0; static float mux_preload= 0.5; @@ -162,7 +170,7 @@ static muxer_stream_t* lavf_new_stream(m muxer_stream_priv_t *spriv; AVCodecContext *ctx; - if(!muxer || (type != MUXER_TYPE_VIDEO && type != MUXER_TYPE_AUDIO)) + if(!muxer || (type != MUXER_TYPE_VIDEO && type != MUXER_TYPE_AUDIO && type != MUXER_TYPE_SUBS)) { MSG_ERR("UNKNOW TYPE %d\n", type); return NULL; @@ -214,10 +222,13 @@ static muxer_stream_t* lavf_new_stream(m return stream; } -#if 0 -static void fix_parameters(muxer_stream_t *stream) +static void fix_parameters(struct muxer_t *muxer) { - muxer_stream_priv_t *spriv = (muxer_stream_priv_t *) stream->priv; + unsigned i; + for(i=0;i<muxer->avih.dwStreams;i++) + { + muxer_stream_t *stream=muxer->streams[i]; + muxer_stream_priv_t *spriv = stream->priv; AVCodecContext *ctx; #if LIBAVFORMAT_BUILD >= 4629 @@ -228,8 +239,8 @@ static void fix_parameters(muxer_stream_ if(stream->wf && stream->wf->nAvgBytesPerSec) ctx->bit_rate = stream->wf->nAvgBytesPerSec * 8; - ctx->rc_buffer_size= stream->vbv_size; - ctx->rc_max_rate= stream->max_rate; + ctx->rc_buffer_size=0; + ctx->rc_max_rate=0; if(stream->type == MUXER_TYPE_AUDIO) { @@ -249,7 +260,7 @@ static void fix_parameters(muxer_stream_ ctx->block_align = stream->h.dwSampleSize; if(stream->wf+1 && stream->wf->cbSize) { - ctx->extradata = av_malloc(stream->wf->cbSize); + ctx->extradata = malloc(stream->wf->cbSize); if(ctx->extradata != NULL) { ctx->extradata_size = stream->wf->cbSize; @@ -278,7 +289,7 @@ static void fix_parameters(muxer_stream_ #endif if(stream->bih+1 && (stream->bih->biSize > sizeof(BITMAPINFOHEADER))) { - ctx->extradata = av_malloc(stream->bih->biSize - sizeof(BITMAPINFOHEADER)); + ctx->extradata = malloc(stream->bih->biSize - sizeof(BITMAPINFOHEADER)); if(ctx->extradata != NULL) { ctx->extradata_size = stream->bih->biSize - sizeof(BITMAPINFOHEADER); @@ -289,8 +300,8 @@ static void fix_parameters(muxer_stream_ stream->bih->biSize - sizeof(BITMAPINFOHEADER)); } } + } } -#endif /* initialize optional fields of a packet */ static inline void av_init_pkt(AVPacket *pkt) @@ -332,10 +343,18 @@ static void write_chunk(muxer_stream_t * #endif //fprintf(stderr, "%Ld %Ld id:%d tb:%f %f\n", pkt.dts, pkt.pts, pkt.stream_index, av_q2d(priv->oc->streams[pkt.stream_index]->time_base), stream->timer); - if(av_interleaved_write_frame(priv->oc, &pkt) != 0) //av_write_frame(priv->oc, &pkt) + if(muxer->avih.dwStreams>1) { + if(av_interleaved_write_frame(priv->oc, &pkt) != 0) //av_write_frame(priv->oc, &pkt) + { MSG_ERR("Error while writing frame\n"); + } + }else{ } + if(av_write_frame(priv->oc, &pkt) != 0) + { + MSG_ERR("Error while writing frame\n"); + } } return; @@ -344,9 +363,27 @@ static void write_chunk(muxer_stream_t * static void write_header(muxer_t *muxer,demuxer_t*dinfo) { + const char *sname; muxer_priv_t *priv = (muxer_priv_t *) muxer->priv; MSG_INFO("Writing header\n"); + + if((sname=demux_info_get(dinfo,INFOT_NAME))!=NULL) + if(sname[0]) strncpy(priv->oc->title,sname,512); + if((sname=demux_info_get(dinfo,INFOT_AUTHOR))!=NULL) + if(sname[0]) strncpy(priv->oc->author,sname,512); + if((sname=demux_info_get(dinfo,INFOT_COPYRIGHT))!=NULL) + if(sname[0]) strncpy(priv->oc->copyright,sname,512); + if((sname=demux_info_get(dinfo,INFOT_COMMENTS))!=NULL) + if(sname[0]) strncpy(priv->oc->comment,sname,512); + if((sname=demux_info_get(dinfo,INFOT_ALBUM))!=NULL) + if(sname[0]) strncpy(priv->oc->album,sname,512); + if((sname=demux_info_get(dinfo,INFOT_GENRE))!=NULL) + if(sname[0]) strncpy(priv->oc->genre,sname,32); + if((sname=demux_info_get(dinfo,INFOT_TRACK))!=NULL) + if(sname[0]) priv->oc->track=atoi(sname); + if((sname=demux_info_get(dinfo,INFOT_DATE))!=NULL) + if(sname[0]) priv->oc->year=atoi(sname); av_write_header(priv->oc); muxer->cont_write_header = NULL; } @@ -369,38 +406,27 @@ static void write_index(muxer_t *muxer) av_free(priv->oc); } -void muxer_init_muxer_lavf(muxer_t *muxer) +int muxer_init_muxer_lavf(muxer_t *muxer,const char *subtype) { muxer_priv_t *priv; AVOutputFormat *fmt = NULL; - char mp_filename[256] = "menc://stream.dummy"; + char mp_filename[256] = "mpxp://stream.dummy"; - MSG_WARN( "** MUXER_LAVF *****************************************************************\n"); - if (!conf_allow_lavf) { - MSG_FATAL( -"If you wish to use libavformat muxing, you must ensure that your video stream\n" -"does not contain B frames (out of order decoding) and specify:\n" -" -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames\n" -"on the command line.\n"); - } else { - MSG_WARN( -"You have certified that your video stream does not contain B frames.\n"); - } MSG_WARN( -"REMEMBER: MEncoder's libavformat muxing is presently broken and will generate\n" -"INCORRECT files in the presence of B frames. Moreover, due to bugs MPlayer\n" -"will play these INCORRECT files as if nothing were wrong!\n" +"** MUXER_LAVF *****************************************************************\n" +"If you wish to use libavformat muxing, you must ensure that your video stream\n" +"does not contain B frames (out of order decoding)\n" +"REMEMBER: libavformat muxing is presently broken and will generate\n" +"INCORRECT files in the presence of B frames\n" "*******************************************************************************\n"); - if (!conf_allow_lavf) return /*0*/; - priv = (muxer_priv_t *) calloc(1, sizeof(muxer_priv_t)); if(priv == NULL) - return /*0*/; + return 0; if(!load_dll(codec_name("libavformat.so"))) /* try local copy first */ { MSG_ERR("Detected error during loading libavformat.so! Try to upgrade this library\n"); - return /*0*/; + return 0; } av_register_all(); @@ -411,11 +437,9 @@ void muxer_init_muxer_lavf(muxer_t *muxe goto fail; } - if(conf_format) - fmt = guess_format(conf_format, NULL, NULL); - if(! fmt) + if(!(fmt = guess_format(subtype, NULL, NULL))) { - MSG_FATAL("CAN'T GET SPECIFIED FORMAT\n"); + MSG_FATAL("CAN'T GET SPECIFIED FORMAT '%s'\n",subtype); goto fail; } priv->oc->oformat = fmt; @@ -446,15 +470,15 @@ void muxer_init_muxer_lavf(muxer_t *muxe muxer->cont_write_chunk = &write_chunk; muxer->cont_write_header = &write_header; muxer->cont_write_index = &write_index; -// muxer->fix_stream_parameters = &fix_parameters; + muxer->fix_parameters = &fix_parameters; MSG_V("OK, exit\n"); - return /*1*/; + return 1; fail: dlclose(dll_handle); free(priv); - return /*0*/; + return 0; } #else //HAVE_LOCAL_FFMPEG -int muxer_init_muxer_lavf(muxer_t *muxer) { return; } +int muxer_init_muxer_lavf(muxer_t *muxer,const char *subtype) { return 0; } #endif Index: mux_mpxp64.c =================================================================== RCS file: /cvsroot/mplayerxp/mplayerxp/mplayerxp/libmpdemux/mux_mpxp64.c,v retrieving revision 1.9 retrieving revision 1.10 diff -p -u -d -r1.9 -r1.10 --- mux_mpxp64.c 16 Feb 2006 07:21:21 -0000 1.9 +++ mux_mpxp64.c 20 Feb 2006 18:17:33 -0000 1.10 @@ -193,11 +193,12 @@ static muxer_stream_t* mpxpav64_new_stre case MUXER_TYPE_VIDEO: if(!muxer->def_v) muxer->def_v=s; break; + case MUXER_TYPE_SUBS: case MUXER_TYPE_AUDIO: break; default: MSG_WARN("WarninG! unknown stream type: %d\n",type); - return NULL; + break; } muxer->avih.dwStreams++; return s; --- mux_asf.c DELETED --- --- mux_avi.c DELETED --- --- mux_mpeg.c DELETED --- |