diff options
author | Uoti Urpala <uau@symbol.nonexistent.invalid> | 2008-06-04 08:10:48 +0300 |
---|---|---|
committer | Uoti Urpala <uau@symbol.nonexistent.invalid> | 2008-06-04 08:10:48 +0300 |
commit | d5c868325cefcd5fad53361d1dfdc9757674eb70 (patch) | |
tree | a838e509fdc2468220466e6337097b3ef590b00c /libmpdemux | |
parent | 0cb5123c8f65b3d7715deb22ce8430eccc21996e (diff) | |
parent | 5b3834c5d1033f05d798278c33782c5563247062 (diff) | |
download | mpv-d5c868325cefcd5fad53361d1dfdc9757674eb70.tar.bz2 mpv-d5c868325cefcd5fad53361d1dfdc9757674eb70.tar.xz |
Merge svn changes up to r26979
Most of the conflicts are trivial.
Conflicts:
Makefile
cfg-mplayer.h
input/input.c
libmenu/vf_menu.c
libmpcodecs/dec_video.c
libmpcodecs/vf_expand.c
libmpcodecs/vf_vo.c
libmpdemux/demux_mkv.c
libmpdemux/demuxer.c
libmpdemux/demuxer.h
libvo/vo_directfb2.c
libvo/vo_gl.c
libvo/vo_winvidix.c
libvo/vo_xv.c
libvo/vo_xvidix.c
libvo/vo_xvmc.c
libvo/x11_common.c
mplayer.c
osdep/timer-linux.c
stream/cache2.c
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_audio.c | 3 | ||||
-rw-r--r-- | libmpdemux/demux_avs.h | 8 | ||||
-rw-r--r-- | libmpdemux/demux_demuxers.c | 5 | ||||
-rw-r--r-- | libmpdemux/demux_film.c | 4 | ||||
-rw-r--r-- | libmpdemux/demux_fli.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_mpg.c | 8 | ||||
-rw-r--r-- | libmpdemux/demux_ts.c | 7 | ||||
-rw-r--r-- | libmpdemux/demux_xmms.c | 4 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 49 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 1 | ||||
-rw-r--r-- | libmpdemux/mp_taglists.c | 2 | ||||
-rw-r--r-- | libmpdemux/muxer_lavf.c | 59 | ||||
-rw-r--r-- | libmpdemux/muxer_mpeg.c | 17 |
13 files changed, 60 insertions, 109 deletions
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c index 032c739fc6..d1717c791e 100644 --- a/libmpdemux/demux_audio.c +++ b/libmpdemux/demux_audio.c @@ -293,7 +293,8 @@ static int demux_audio_open(demuxer_t* demuxer) { } } else if( hdr[0] == 'f' && hdr[1] == 'L' && hdr[2] == 'a' && hdr[3] == 'C' ) { frmt = fLaC; - break; + if (!mp3_hdrs || mp3_hdrs->cons_hdrs < 3) + break; } // Add here some other audio format detection if(step < HDR_SIZE) diff --git a/libmpdemux/demux_avs.h b/libmpdemux/demux_avs.h index 29526d6964..0962146281 100644 --- a/libmpdemux/demux_avs.h +++ b/libmpdemux/demux_avs.h @@ -132,15 +132,15 @@ static inline AVS_Value avs_new_value_array(AVS_Value * v0, int size) static inline int avs_is_error(AVS_Value v) { return v.type == 'e'; } static inline int avs_is_clip(AVS_Value v) { return v.type == 'c'; } static inline int avs_is_string(AVS_Value v) { return v.type == 's'; } -static inline int avs_has_video(const AVS_VideoInfo * p) { return (p->width!=0); } -static inline int avs_has_audio(const AVS_VideoInfo * p) { return (p->audio_samples_per_second!=0); } +static inline int avs_has_video(const AVS_VideoInfo * p) { return p->width != 0; } +static inline int avs_has_audio(const AVS_VideoInfo * p) { return p->audio_samples_per_second != 0; } static inline const char * avs_as_string(AVS_Value v) { return avs_is_error(v) || avs_is_string(v) ? v.d.string : 0; } /* Color spaces */ static inline int avs_is_rgb(const AVS_VideoInfo * p) -{ return (p->pixel_type&AVS_CS_BGR); } +{ return p->pixel_type & AVS_CS_BGR; } static inline int avs_is_rgb24(const AVS_VideoInfo * p) { return (p->pixel_type&AVS_CS_BGR24)==AVS_CS_BGR24; } // Clear out additional properties @@ -149,7 +149,7 @@ static inline int avs_is_rgb32(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_BGR32) == AVS_CS_BGR32 ; } static inline int avs_is_yuy(const AVS_VideoInfo * p) -{ return (p->pixel_type&AVS_CS_YUV ); } +{ return p->pixel_type & AVS_CS_YUV; } static inline int avs_is_yuy2(const AVS_VideoInfo * p) { return (p->pixel_type & AVS_CS_YUY2) == AVS_CS_YUY2; } diff --git a/libmpdemux/demux_demuxers.c b/libmpdemux/demux_demuxers.c index 615e1961ee..a5f87e601b 100644 --- a/libmpdemux/demux_demuxers.c +++ b/libmpdemux/demux_demuxers.c @@ -38,6 +38,11 @@ demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) { ret->audio = ad->audio; ret->sub = sd->sub; + // HACK?, necessary for subtitle (and audio and video when implemented) switching + memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams)); + memcpy(ret->a_streams, ad->a_streams, sizeof(ret->a_streams)); + memcpy(ret->s_streams, sd->s_streams, sizeof(ret->s_streams)); + ret->desc = &demuxer_desc_demuxers; return ret; diff --git a/libmpdemux/demux_film.c b/libmpdemux/demux_film.c index e6285a759a..c310f3bd18 100644 --- a/libmpdemux/demux_film.c +++ b/libmpdemux/demux_film.c @@ -238,7 +238,7 @@ static demuxer_t* demux_open_film(demuxer_t* demuxer) { mp_msg(MSGT_DEMUX, MSGL_ERR, "Not a FILM file\n"); free(film_data); - return(NULL); + return NULL; } // get the header size, which implicitly points past the header and @@ -428,7 +428,7 @@ static demuxer_t* demux_open_film(demuxer_t* demuxer) default: mp_msg(MSGT_DEMUX, MSGL_ERR, "Unrecognized FILM header chunk: %08X\n", chunk_type); - return(NULL); + return NULL; break; } } diff --git a/libmpdemux/demux_fli.c b/libmpdemux/demux_fli.c index e66becc62a..37fa4d4559 100644 --- a/libmpdemux/demux_fli.c +++ b/libmpdemux/demux_fli.c @@ -95,7 +95,7 @@ static demuxer_t* demux_open_fli(demuxer_t* demuxer){ magic_number); free(header); free(frames); - return(NULL); + return NULL; } // fetch the number of frames diff --git a/libmpdemux/demux_mpg.c b/libmpdemux/demux_mpg.c index 3ebec07a8e..55da5f00a6 100644 --- a/libmpdemux/demux_mpg.c +++ b/libmpdemux/demux_mpg.c @@ -158,9 +158,7 @@ static float read_first_mpeg_pts_at_position(demuxer_t* demuxer, off_t stream_po if(found == 3) pts = found_pts3; //clean up from searching of first pts; - ds_free_packs(demuxer->audio); - ds_free_packs(demuxer->video); - ds_free_packs(demuxer->sub); + demux_flush(demuxer); return pts; } @@ -981,9 +979,7 @@ void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,float audio_delay, in //prepare another seek because we are off by more than 0.5s if(mpg_d) { newpos += (newpts - mpg_d->last_pts) * (newpos - oldpos) / (mpg_d->last_pts - oldpts); - ds_free_packs(d_audio); - ds_free_packs(d_video); - ds_free_packs(demuxer->sub); + demux_flush(demuxer); demuxer->stream->eof=0; // clear eof flag d_video->eof=0; d_audio->eof=0; diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c index b746fa18b0..8e57fa3129 100644 --- a/libmpdemux/demux_ts.c +++ b/libmpdemux/demux_ts.c @@ -3139,13 +3139,8 @@ static void demux_seek_ts(demuxer_t *demuxer, float rel_seek_secs, float audio_d ts_dump_streams(demuxer->priv); reset_fifos(demuxer, sh_audio != NULL, sh_video != NULL, demuxer->sub->id > 0); + demux_flush(demuxer); - if(sh_audio != NULL) - ds_free_packs(d_audio); - if(sh_video != NULL) - ds_free_packs(d_video); - if(demuxer->sub->id > 0) - ds_free_packs(d_sub); video_stats = (sh_video != NULL); diff --git a/libmpdemux/demux_xmms.c b/libmpdemux/demux_xmms.c index 7bd2f6546a..c6bf5eae90 100644 --- a/libmpdemux/demux_xmms.c +++ b/libmpdemux/demux_xmms.c @@ -75,8 +75,8 @@ static void disk_flush(int time) { } static int disk_free(void) { // vqf plugin sends more than it should - return (XMMS_PACKETSIZE-xmms_audiopos<XMMS_PACKETSIZE/4 ? - 0:XMMS_PACKETSIZE-xmms_audiopos-XMMS_PACKETSIZE/4); + return XMMS_PACKETSIZE - xmms_audiopos < XMMS_PACKETSIZE / 4 ? + 0 : XMMS_PACKETSIZE - xmms_audiopos - XMMS_PACKETSIZE / 4; } static int disk_playing(void) { diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 1762f99741..8987f1679a 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -122,9 +122,6 @@ const demuxer_desc_t *const demuxer_list[] = { &demuxer_desc_mpeg_gxf, &demuxer_desc_mpeg4_es, &demuxer_desc_h264_es, -#ifdef MUSEPACK - &demuxer_desc_mpc, -#endif &demuxer_desc_audio, &demuxer_desc_mpeg_ty, #ifdef STREAMING_LIVE555 @@ -136,6 +133,9 @@ const demuxer_desc_t *const demuxer_list[] = { #ifdef USE_LIBAVFORMAT &demuxer_desc_lavf, #endif +#ifdef MUSEPACK + &demuxer_desc_mpc, +#endif #ifdef HAVE_LIBDV095 &demuxer_desc_rawdv, #endif @@ -277,10 +277,11 @@ sh_audio_t *new_sh_audio_aid(demuxer_t *demuxer, int id, int aid) if (demuxer->a_streams[id]) { mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_AudioStreamRedefined, id); } else { - sh_audio_t *sh; mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundAudioStream, id); - demuxer->a_streams[id] = calloc(1, sizeof(sh_audio_t)); - sh = demuxer->a_streams[id]; + sh_audio_t *sh = calloc(1, sizeof(sh_audio_t)); + demuxer->a_streams[id] = sh; + sh->aid = aid; + sh->ds = demuxer->audio; // set some defaults sh->samplesize = 2; sh->sample_format = AF_FORMAT_S16_NE; @@ -289,7 +290,6 @@ sh_audio_t *new_sh_audio_aid(demuxer_t *demuxer, int id, int aid) sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid); } - ((sh_audio_t *) demuxer->a_streams[id])->aid = aid; return demuxer->a_streams[id]; } @@ -318,10 +318,11 @@ sh_video_t *new_sh_video_vid(demuxer_t *demuxer, int id, int vid) mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundVideoStream, id); sh_video_t *sh = calloc(1, sizeof *sh); demuxer->v_streams[id] = sh; + sh->vid = vid; + sh->ds = demuxer->video; sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid); } - ((sh_video_t *) demuxer->v_streams[id])->vid = vid; return demuxer->v_streams[id]; } @@ -1049,6 +1050,13 @@ demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, } +void demux_flush(demuxer_t *demuxer) +{ + ds_free_packs(demuxer->video); + ds_free_packs(demuxer->audio); + ds_free_packs(demuxer->sub); +} + int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { @@ -1071,12 +1079,9 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, return 0; } // clear demux buffers: - if (sh_audio) { - ds_free_packs(d_audio); + demux_flush(demuxer); + if (sh_audio) sh_audio->a_buffer_len = 0; - } - ds_free_packs(d_video); - ds_free_packs(demuxer->sub); demuxer->stream->eof = 0; demuxer->video->eof = 0; @@ -1337,14 +1342,7 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, chapter += current; } - if (demuxer->video->sh) - ds_free_packs(demuxer->video); - - if (demuxer->audio->sh) - ds_free_packs(demuxer->audio); - - if (demuxer->sub->id >= 0) - ds_free_packs(demuxer->sub); + demux_flush(demuxer); ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, @@ -1526,14 +1524,7 @@ int demuxer_set_angle(demuxer_t *demuxer, int angle) if ((angles < 1) || (angle > angles)) return -1; - if (demuxer->video->sh) - ds_free_packs(demuxer->video); - - if (demuxer->audio->sh) - ds_free_packs(demuxer->audio); - - if (demuxer->sub->id >= 0) - ds_free_packs(demuxer->sub); + demux_flush(demuxer); ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle); if (ris == STREAM_UNSUPPORTED) diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 30ab6f69e6..76ab7221e4 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -366,6 +366,7 @@ static inline int avi_stream_id(unsigned int id){ } demuxer_t* demux_open(struct MPOpts *opts, stream_t *stream,int file_format,int aid,int vid,int sid,char* filename); +void demux_flush(demuxer_t *demuxer); int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags); demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd); diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c index 5bcf739188..a620ef5649 100644 --- a/libmpdemux/mp_taglists.c +++ b/libmpdemux/mp_taglists.c @@ -24,6 +24,7 @@ static const AVCodecTag mp_wav_tags[] = { { CODEC_ID_ADPCM_4XM, MKTAG('4', 'X', 'M', 'A')}, { CODEC_ID_ADPCM_EA, MKTAG('A', 'D', 'E', 'A')}, + { CODEC_ID_ADPCM_EA_MAXIS_XA, MKTAG('A', 'D', 'X', 'A')}, { CODEC_ID_ADPCM_IMA_WS, MKTAG('A', 'I', 'W', 'S')}, { CODEC_ID_ADPCM_THP, MKTAG('T', 'H', 'P', 'A')}, { CODEC_ID_AMR_NB, MKTAG('n', 'b', 0, 0)}, @@ -33,6 +34,7 @@ static const AVCodecTag mp_wav_tags[] = { { CODEC_ID_MUSEPACK7, MKTAG('M', 'P', 'C', ' ')}, { CODEC_ID_MUSEPACK8, MKTAG('M', 'P', 'C', '8')}, { CODEC_ID_NELLYMOSER, MKTAG('N', 'E', 'L', 'L')}, + { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'p')}, { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2')}, { CODEC_ID_ROQ_DPCM, MKTAG('R', 'o', 'Q', 'A')}, { CODEC_ID_SHORTEN, MKTAG('s', 'h', 'r', 'n')}, diff --git a/libmpdemux/muxer_lavf.c b/libmpdemux/muxer_lavf.c index 12410f542e..fe7f5715fc 100644 --- a/libmpdemux/muxer_lavf.c +++ b/libmpdemux/muxer_lavf.c @@ -32,6 +32,8 @@ extern char *info_copyright; extern char *info_sourceform; extern char *info_comment; +#define BIO_BUFFER_SIZE 32768 + typedef struct { //AVInputFormat *avif; AVFormatContext *oc; @@ -39,6 +41,7 @@ typedef struct { int audio_streams; int video_streams; int64_t last_pts; + uint8_t buffer[BIO_BUFFER_SIZE]; } muxer_priv_t; typedef struct { @@ -64,39 +67,15 @@ m_option_t lavfopts_conf[] = { {NULL, NULL, 0, 0, 0, 0, NULL} }; -/* This should be transmitted to mp_open() through the filename when - * thread safety is needed but MPlayer == no threads and especially - * not multiple muxers being initialized at once so there is no - * point in the extra complexity, a static is simpler. */ -static muxer_t *priv_data; - -static int mp_open(URLContext *h, const char *filename, int flags) -{ - h->priv_data= priv_data; - return 0; -} - -static int mp_close(URLContext *h) -{ - return 0; -} - - -static int mp_read(URLContext *h, unsigned char *buf, int size) +static int mp_write(void *opaque, uint8_t *buf, int size) { - mp_msg(MSGT_MUXER, MSGL_WARN, "READ %d\n", size); - return -1; -} - -static int mp_write(URLContext *h, unsigned char *buf, int size) -{ - muxer_t *muxer = (muxer_t*)h->priv_data; + muxer_t *muxer = opaque; return stream_write_buffer(muxer->stream, buf, size); } -static offset_t mp_seek(URLContext *h, offset_t pos, int whence) +static offset_t mp_seek(void *opaque, offset_t pos, int whence) { - muxer_t *muxer = (muxer_t*)h->priv_data; + muxer_t *muxer = opaque; if(whence == SEEK_CUR) { off_t cur = stream_tell(muxer->stream); @@ -118,16 +97,6 @@ static offset_t mp_seek(URLContext *h, offset_t pos, int whence) } -static URLProtocol mp_protocol = { - "menc", - mp_open, - mp_read, - mp_write, - mp_seek, - mp_close, - NULL -}; - static muxer_stream_t* lavf_new_stream(muxer_t *muxer, int type) { muxer_priv_t *priv = muxer->priv; @@ -321,7 +290,7 @@ static void write_trailer(muxer_t *muxer) av_freep(&(priv->oc->streams[i])); } - url_fclose(priv->oc->pb); + av_freep(&priv->oc->pb); av_free(priv->oc); } @@ -338,7 +307,6 @@ int muxer_init_muxer_lavf(muxer_t *muxer) { muxer_priv_t *priv; AVOutputFormat *fmt = NULL; - char mp_filename[256] = "menc://stream.dummy"; av_register_all(); @@ -404,14 +372,9 @@ int muxer_init_muxer_lavf(muxer_t *muxer) } } - register_protocol(&mp_protocol); - - priv_data= muxer; - if(url_fopen(&priv->oc->pb, mp_filename, URL_WRONLY)) - { - mp_msg(MSGT_MUXER, MSGL_FATAL, "Could not open outfile.\n"); - goto fail; - } + priv->oc->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 1, muxer, NULL, mp_write, mp_seek); + if ((muxer->stream->flags & STREAM_SEEK) != STREAM_SEEK) + priv->oc->pb->is_streamed = 1; muxer->priv = (void *) priv; muxer->cont_new_stream = &lavf_new_stream; diff --git a/libmpdemux/muxer_mpeg.c b/libmpdemux/muxer_mpeg.c index f5367e515b..2a659b7f00 100644 --- a/libmpdemux/muxer_mpeg.c +++ b/libmpdemux/muxer_mpeg.c @@ -231,27 +231,25 @@ static void fix_audio_sys_header(muxer_priv_t *priv, uint8_t id, uint8_t newid, static inline int is_mpeg1(uint32_t x) { - return ( + return (x == 0x10000001) || (x == mmioFOURCC('m','p','g','1')) || - (x == mmioFOURCC('M','P','G','1')) - ); + (x == mmioFOURCC('M','P','G','1')); } static inline int is_mpeg2(uint32_t x) { - return ( + return (x == 0x10000002) || (x == mmioFOURCC('m','p','g','2')) || (x == mmioFOURCC('M','P','G','2')) || (x == mmioFOURCC('m','p','e','g')) || - (x == mmioFOURCC('M','P','E','G')) - ); + (x == mmioFOURCC('M','P','E','G')); } static inline int is_mpeg4(uint32_t x) { - return ( + return (x == 0x10000004) || (x == mmioFOURCC('d','i','v','x')) || (x == mmioFOURCC('D','I','V','X')) || @@ -265,8 +263,7 @@ static inline int is_mpeg4(uint32_t x) (x == mmioFOURCC('F', 'M','P','4')) || (x == mmioFOURCC('f', 'm','p','4')) || (x == mmioFOURCC('D', 'X','5','0')) || - (x == mmioFOURCC('d', 'x','5','0')) - ); + (x == mmioFOURCC('d', 'x','5','0')); } //from unrarlib.c @@ -666,7 +663,7 @@ static int write_mpeg_psm(muxer_t *muxer, char *buff) static int psm_is_late(muxer_priv_t *priv) { - return (!priv->data_size || (priv->scr >= priv->last_psm_scr + 27000000ULL)); + return !priv->data_size || (priv->scr >= priv->last_psm_scr + 27000000ULL); } static int write_mpeg_pes_header(muxer_headers_t *h, uint8_t *pes_id, uint8_t *buff, uint16_t plen, int stuffing_len, int mux_type) |