summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@symbol.nonexistent.invalid>2008-06-04 08:10:48 +0300
committerUoti Urpala <uau@symbol.nonexistent.invalid>2008-06-04 08:10:48 +0300
commitd5c868325cefcd5fad53361d1dfdc9757674eb70 (patch)
treea838e509fdc2468220466e6337097b3ef590b00c /libmpdemux
parent0cb5123c8f65b3d7715deb22ce8430eccc21996e (diff)
parent5b3834c5d1033f05d798278c33782c5563247062 (diff)
downloadmpv-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.c3
-rw-r--r--libmpdemux/demux_avs.h8
-rw-r--r--libmpdemux/demux_demuxers.c5
-rw-r--r--libmpdemux/demux_film.c4
-rw-r--r--libmpdemux/demux_fli.c2
-rw-r--r--libmpdemux/demux_mpg.c8
-rw-r--r--libmpdemux/demux_ts.c7
-rw-r--r--libmpdemux/demux_xmms.c4
-rw-r--r--libmpdemux/demuxer.c49
-rw-r--r--libmpdemux/demuxer.h1
-rw-r--r--libmpdemux/mp_taglists.c2
-rw-r--r--libmpdemux/muxer_lavf.c59
-rw-r--r--libmpdemux/muxer_mpeg.c17
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)