From be882175d85d8b1ea253dce11494a53264d04148 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 21 Jun 2015 18:06:14 +0200 Subject: demux: merge extradata fields MPlayer traditionally had completely separate sh_ structs for audio/video/subs, without a good way to share fields. This meant that fields shared across all these headers had to be duplicated. This commit deduplicates essentially the last remaining duplicated fields. --- demux/demux_disc.c | 4 ++-- demux/demux_lavf.c | 6 +++--- demux/demux_libass.c | 4 ++-- demux/demux_mkv.c | 13 ++++++------- demux/stheader.h | 9 +++------ 5 files changed, 16 insertions(+), 20 deletions(-) (limited to 'demux') diff --git a/demux/demux_disc.c b/demux/demux_disc.c index 6a9220189c..68ad3817fa 100644 --- a/demux/demux_disc.c +++ b/demux/demux_disc.c @@ -112,8 +112,8 @@ static void add_dvd_streams(demuxer_t *demuxer) } s = talloc_asprintf_append(s, "\n"); - sh->sub->extradata = s; - sh->sub->extradata_len = strlen(s); + sh->extradata = s; + sh->extradata_size = strlen(s); } } } diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 608bf0e03c..5689246114 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -592,9 +592,9 @@ static void handle_stream(demuxer_t *demuxer, int i) sh_sub = sh->sub; if (codec->extradata_size) { - sh_sub->extradata = talloc_size(sh, codec->extradata_size); - memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size); - sh_sub->extradata_len = codec->extradata_size; + sh->extradata = talloc_size(sh, codec->extradata_size); + memcpy(sh->extradata, codec->extradata, codec->extradata_size); + sh->extradata_size = codec->extradata_size; } if (matches_avinputformat_name(priv, "microdvd")) { diff --git a/demux/demux_libass.c b/demux/demux_libass.c index b83408b21b..ef09f042ed 100644 --- a/demux/demux_libass.c +++ b/demux/demux_libass.c @@ -95,8 +95,8 @@ static int d_check_file(struct demuxer *demuxer, enum demux_check check) struct sh_stream *sh = new_sh_stream(demuxer, STREAM_SUB); sh->codec = "ass"; - sh->sub->extradata = cbuf.start; - sh->sub->extradata_len = cbuf.len; + sh->extradata = cbuf.start; + sh->extradata_size = cbuf.len; demuxer->seekable = true; demuxer->fully_read = true; diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 74ea002162..4068b23807 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1310,8 +1310,8 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) return 1; } - sh_v->extradata = talloc_memdup(sh_v, extradata, extradata_size); - sh_v->extradata_len = extradata_size; + sh->extradata = talloc_memdup(sh_v, extradata, extradata_size); + sh->extradata_size = extradata_size; if (!sh->codec) { MP_WARN(demuxer, "Unknown/unsupported CodecID (%s) or missing/bad " "CodecPrivate data (track %u).\n", @@ -1574,8 +1574,8 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) if (sh_a->samplerate == 8000 && strcmp(codec, "ac3") == 0) track->default_duration = 0; - sh_a->codecdata = extradata; - sh_a->codecdata_len = extradata_len; + sh->extradata = extradata; + sh->extradata_size = extradata_len; return 0; @@ -1629,9 +1629,8 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track) track->private_data = buffer.start; track->private_size = buffer.len; } - sh_s->extradata = talloc_size(sh, track->private_size); - memcpy(sh_s->extradata, track->private_data, track->private_size); - sh_s->extradata_len = track->private_size; + sh->extradata = track->private_data; + sh->extradata_size = track->private_size; if (track->language && (strcmp(track->language, "und") != 0)) sh->lang = talloc_strdup(sh, track->language); sh->title = talloc_strdup(sh, track->name); diff --git a/demux/stheader.h b/demux/stheader.h index ae346ee8d0..fdb302713c 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -49,6 +49,9 @@ struct sh_stream { // Usually a FourCC, exact meaning depends on codec. unsigned int codec_tag; + unsigned char *extradata; // codec specific per-stream header + int extradata_size; + // Codec specific header data (set by demux_lavf.c only) struct AVCodecContext *lav_headers; @@ -73,8 +76,6 @@ typedef struct sh_audio { int bitrate; // compressed bits/sec int block_align; int bits_per_coded_sample; - unsigned char *codecdata; - int codecdata_len; struct replaygain_data *replaygain_data; } sh_audio_t; @@ -83,16 +84,12 @@ typedef struct sh_video { float fps; // frames per second (set only if constant fps) float aspect; // aspect ratio stored in the file (for prescaling) int bits_per_coded_sample; - unsigned char *extradata; - int extradata_len; int disp_w, disp_h; // display size int rotate; // intended display rotation, in degrees, [0, 359] int stereo_mode; // mp_stereo3d_mode (0 if none/unknown) } sh_video_t; typedef struct sh_sub { - unsigned char *extradata; // extra header data passed from demuxer - int extradata_len; double frame_based; // timestamps are frame-based (and this is the // fallback framerate used for timestamps) bool is_utf8; // if false, subtitle packet charset is unknown -- cgit v1.2.3