diff options
-rw-r--r-- | audio/decode/ad_lavc.c | 31 | ||||
-rw-r--r-- | audio/decode/dec_audio.c | 4 | ||||
-rw-r--r-- | demux/codec_tags.c | 16 | ||||
-rw-r--r-- | demux/codec_tags.h | 8 | ||||
-rw-r--r-- | demux/demux.c | 15 | ||||
-rw-r--r-- | demux/demux_disc.c | 24 | ||||
-rw-r--r-- | demux/demux_lavf.c | 57 | ||||
-rw-r--r-- | demux/demux_mf.c | 17 | ||||
-rw-r--r-- | demux/demux_mkv.c | 90 | ||||
-rw-r--r-- | demux/demux_mkv_timeline.c | 2 | ||||
-rw-r--r-- | demux/demux_raw.c | 32 | ||||
-rw-r--r-- | demux/demux_tv.c | 32 | ||||
-rw-r--r-- | demux/stheader.h | 51 | ||||
-rw-r--r-- | player/audio.c | 2 | ||||
-rw-r--r-- | player/command.c | 23 | ||||
-rw-r--r-- | player/loadfile.c | 2 | ||||
-rw-r--r-- | player/sub.c | 6 | ||||
-rw-r--r-- | player/video.c | 4 | ||||
-rw-r--r-- | sub/dec_sub.c | 6 | ||||
-rw-r--r-- | sub/sd.h | 2 | ||||
-rw-r--r-- | sub/sd_ass.c | 10 | ||||
-rw-r--r-- | sub/sd_lavc.c | 4 | ||||
-rw-r--r-- | video/decode/dec_video.c | 16 | ||||
-rw-r--r-- | video/decode/vd_lavc.c | 25 |
24 files changed, 232 insertions, 247 deletions
diff --git a/audio/decode/ad_lavc.c b/audio/decode/ad_lavc.c index f4a0a243d1..7e5c8d5aa5 100644 --- a/audio/decode/ad_lavc.c +++ b/audio/decode/ad_lavc.c @@ -79,12 +79,12 @@ static int init(struct dec_audio *da, const char *decoder) AVCodecContext *lavc_context; AVCodec *lavc_codec; struct sh_stream *sh = da->header; - struct sh_audio *sh_audio = sh->audio; + struct mp_codec_params *c = sh->codec; struct priv *ctx = talloc_zero(NULL, struct priv); da->priv = ctx; - ctx->force_channel_map = sh_audio->force_channels; + ctx->force_channel_map = c->force_channels; lavc_codec = avcodec_find_decoder_by_name(decoder); if (!lavc_codec) { @@ -116,20 +116,20 @@ static int init(struct dec_audio *da, const char *decoder) mp_set_avopts(da->log, lavc_context, opts->avopts); - lavc_context->codec_tag = sh->codec_tag; - lavc_context->sample_rate = sh_audio->samplerate; - lavc_context->bit_rate = sh_audio->bitrate; - lavc_context->block_align = sh_audio->block_align; - lavc_context->bits_per_coded_sample = sh_audio->bits_per_coded_sample; - lavc_context->channels = sh_audio->channels.num; - if (!mp_chmap_is_unknown(&sh_audio->channels)) - lavc_context->channel_layout = mp_chmap_to_lavc(&sh_audio->channels); + lavc_context->codec_tag = c->codec_tag; + lavc_context->sample_rate = c->samplerate; + lavc_context->bit_rate = c->bitrate; + lavc_context->block_align = c->block_align; + lavc_context->bits_per_coded_sample = c->bits_per_coded_sample; + lavc_context->channels = c->channels.num; + if (!mp_chmap_is_unknown(&c->channels)) + lavc_context->channel_layout = mp_chmap_to_lavc(&c->channels); // demux_mkv - mp_lavc_set_extradata(lavc_context, sh->extradata, sh->extradata_size); + mp_lavc_set_extradata(lavc_context, c->extradata, c->extradata_size); - if (sh->lav_headers) - mp_copy_lav_codec_headers(lavc_context, sh->lav_headers); + if (c->lav_headers) + mp_copy_lav_codec_headers(lavc_context, c->lav_headers); mp_set_avcodec_threads(da->log, lavc_context, opts->threads); @@ -228,9 +228,8 @@ static int decode_packet(struct dec_audio *da, struct mp_audio **out) if (lavc_chmap.num != avctx->channels) mp_chmap_from_channels(&lavc_chmap, avctx->channels); if (priv->force_channel_map) { - struct sh_audio *sh_audio = da->header->audio; - if (lavc_chmap.num == sh_audio->channels.num) - lavc_chmap = sh_audio->channels; + if (lavc_chmap.num == da->header->codec->channels.num) + lavc_chmap = da->header->codec->channels; } mp_audio_set_channels(mpframe, &lavc_chmap); diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 99c01b408e..f774ed1abd 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -88,7 +88,7 @@ struct mp_decoder_list *audio_decoder_list(void) static struct mp_decoder_list *audio_select_decoders(struct dec_audio *d_audio) { struct MPOpts *opts = d_audio->opts; - const char *codec = d_audio->header->codec; + const char *codec = d_audio->header->codec->codec; struct mp_decoder_list *list = audio_decoder_list(); struct mp_decoder_list *new = @@ -146,7 +146,7 @@ int audio_init_best_codec(struct dec_audio *d_audio) MP_VERBOSE(d_audio, "Selected audio codec: %s\n", d_audio->decoder_desc); } else { MP_ERR(d_audio, "Failed to initialize an audio decoder for codec '%s'.\n", - d_audio->header->codec ? d_audio->header->codec : "<unknown>"); + d_audio->header->codec->codec); } talloc_free(list); diff --git a/demux/codec_tags.c b/demux/codec_tags.c index c7b48f6038..7e91291e9e 100644 --- a/demux/codec_tags.c +++ b/demux/codec_tags.c @@ -70,20 +70,20 @@ static const char *map_audio_pcm_tag(uint32_t tag, int bits) } } -void mp_set_codec_from_tag(struct sh_stream *sh) +void mp_set_codec_from_tag(struct mp_codec_params *c) { - sh->codec = lookup_tag(sh->type, sh->codec_tag); + c->codec = lookup_tag(c->type, c->codec_tag); - if (sh->audio && sh->audio->bits_per_coded_sample) { + if (c->type == STREAM_AUDIO && c->bits_per_coded_sample) { const char *codec = - map_audio_pcm_tag(sh->codec_tag, sh->audio->bits_per_coded_sample); + map_audio_pcm_tag(c->codec_tag, c->bits_per_coded_sample); if (codec) - sh->codec = codec; + c->codec = codec; } } -void mp_set_pcm_codec(struct sh_stream *sh, bool sign, bool is_float, int bits, - bool is_be) +void mp_set_pcm_codec(struct mp_codec_params *c, bool sign, bool is_float, + int bits, bool is_be) { // This uses libavcodec pcm codec names, e.g. "pcm_u16le". char codec[64] = "pcm_"; @@ -95,7 +95,7 @@ void mp_set_pcm_codec(struct sh_stream *sh, bool sign, bool is_float, int bits, mp_snprintf_cat(codec, sizeof(codec), "%d", bits); if (bits != 8) mp_snprintf_cat(codec, sizeof(codec), is_be ? "be" : "le"); - sh->codec = talloc_strdup(sh->audio, codec); + c->codec = talloc_strdup(c, codec); } static const char *const mimetype_to_codec[][2] = { diff --git a/demux/codec_tags.h b/demux/codec_tags.h index 3489f0da5c..294759a299 100644 --- a/demux/codec_tags.h +++ b/demux/codec_tags.h @@ -21,12 +21,12 @@ #include <stdint.h> #include <stdbool.h> -struct sh_stream; +struct mp_codec_params; -void mp_set_codec_from_tag(struct sh_stream *sh); +void mp_set_codec_from_tag(struct mp_codec_params *c); -void mp_set_pcm_codec(struct sh_stream *sh, bool sign, bool is_float, int bits, - bool is_be); +void mp_set_pcm_codec(struct mp_codec_params *c, bool sign, bool is_float, + int bits, bool is_be); const char *mp_map_mimetype_to_video_codec(const char *mimetype); diff --git a/demux/demux.c b/demux/demux.c index b251674496..19ad6970b0 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -214,13 +214,9 @@ struct sh_stream *demux_alloc_sh_stream(enum stream_type type) .index = -1, .ff_index = -1, // may be overwritten by demuxer .demuxer_id = -1, // ... same + .codec = talloc_zero(sh, struct mp_codec_params), }; - switch (sh->type) { - case STREAM_VIDEO: sh->video = talloc_zero(sh, struct sh_video); break; - case STREAM_AUDIO: sh->audio = talloc_zero(sh, struct sh_audio); break; - case STREAM_SUB: sh->sub = talloc_zero(sh, struct sh_sub); break; - } - + sh->codec->type = type; return sh; } @@ -241,6 +237,9 @@ void demux_add_sh_stream(struct demuxer *demuxer, struct sh_stream *sh) .selected = in->autoselect, }; + if (!sh->codec->codec) + sh->codec->codec = ""; + sh->index = in->num_streams; if (sh->ff_index < 0) sh->ff_index = sh->index; @@ -855,11 +854,11 @@ static void apply_replaygain(demuxer_t *demuxer, struct replaygain_data *rg) struct demux_internal *in = demuxer->in; for (int n = 0; n < in->num_streams; n++) { struct sh_stream *sh = in->streams[n]; - if (sh->audio && !sh->audio->replaygain_data) { + if (sh->type == STREAM_AUDIO && !sh->codec->replaygain_data) { MP_VERBOSE(demuxer, "Replaygain: Track=%f/%f Album=%f/%f\n", rg->track_gain, rg->track_peak, rg->album_gain, rg->album_peak); - sh->audio->replaygain_data = talloc_memdup(in, rg, sizeof(*rg)); + sh->codec->replaygain_data = talloc_memdup(in, rg, sizeof(*rg)); } } } diff --git a/demux/demux_disc.c b/demux/demux_disc.c index 90c276b414..dcc3e7c79f 100644 --- a/demux/demux_disc.c +++ b/demux/demux_disc.c @@ -84,7 +84,7 @@ static void add_dvd_streams(demuxer_t *demuxer) for (int n = 0; n < MPMIN(32, info.num_subs); n++) { struct sh_stream *sh = demux_alloc_sh_stream(STREAM_SUB); sh->demuxer_id = n + 0x20; - sh->codec = "dvd_subtitle"; + sh->codec->codec = "dvd_subtitle"; get_disc_lang(stream, sh); // p->streams _must_ match with p->slave->streams, so we can't add // it yet - it has to be done when the real stream appears, which @@ -111,8 +111,8 @@ static void add_dvd_streams(demuxer_t *demuxer) } s = talloc_asprintf_append(s, "\n"); - sh->extradata = s; - sh->extradata_size = strlen(s); + sh->codec->extradata = s; + sh->codec->extradata_size = strlen(s); demux_add_sh_stream(demuxer, sh); } @@ -125,7 +125,7 @@ static void add_streams(demuxer_t *demuxer) for (int n = p->num_streams; n < demux_get_num_stream(p->slave); n++) { struct sh_stream *src = demux_get_stream(p->slave, n); - if (src->sub) { + if (src->type == STREAM_SUB) { struct sh_stream *sub = NULL; if (src->demuxer_id >= 0x20 && src->demuxer_id <= 0x3F) sub = p->dvd_subs[src->demuxer_id - 0x20]; @@ -139,24 +139,20 @@ static void add_streams(demuxer_t *demuxer) assert(p->num_streams == n); // directly mapped MP_TARRAY_APPEND(p, p->streams, p->num_streams, sh); // Copy all stream fields that might be relevant - sh->codec = talloc_strdup(sh, src->codec); - sh->codec_tag = src->codec_tag; - sh->lav_headers = src->lav_headers; + *sh->codec = *src->codec; sh->demuxer_id = src->demuxer_id; - if (src->video) { + if (src->type == STREAM_VIDEO) { double ar; if (stream_control(demuxer->stream, STREAM_CTRL_GET_ASPECT_RATIO, &ar) == STREAM_OK) { - struct mp_image_params f = {.w = src->video->disp_w, - .h = src->video->disp_h}; + struct mp_image_params f = {.w = src->codec->disp_w, + .h = src->codec->disp_h}; mp_image_params_set_dsize(&f, 1728 * ar, 1728); - sh->video->par_w = f.p_w; - sh->video->par_h = f.p_h; + sh->codec->par_w = f.p_w; + sh->codec->par_h = f.p_h; } } - if (src->audio) - sh->audio = src->audio; get_disc_lang(demuxer->stream, sh); demux_add_sh_stream(demuxer, sh); } diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index f9586c4788..712b208460 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -499,7 +499,8 @@ static void select_tracks(struct demuxer *demuxer, int start) } } -static void export_replaygain(demuxer_t *demuxer, sh_audio_t *sh, AVStream *st) +static void export_replaygain(demuxer_t *demuxer, struct mp_codec_params *c, + AVStream *st) { for (int i = 0; i < st->nb_side_data; i++) { AVReplayGain *av_rgain; @@ -524,7 +525,7 @@ static void export_replaygain(demuxer_t *demuxer, sh_audio_t *sh, AVStream *st) rgain->album_peak = (av_rgain->album_peak != 0.0) ? av_rgain->album_peak / 100000.0f : 1.0; - sh->replaygain_data = rgain; + c->replaygain_data = rgain; } } @@ -552,22 +553,20 @@ static void handle_new_stream(demuxer_t *demuxer, int i) switch (codec->codec_type) { case AVMEDIA_TYPE_AUDIO: { sh = demux_alloc_sh_stream(STREAM_AUDIO); - sh_audio_t *sh_audio = sh->audio; // probably unneeded - mp_chmap_set_unknown(&sh_audio->channels, codec->channels); + mp_chmap_set_unknown(&sh->codec->channels, codec->channels); if (codec->channel_layout) - mp_chmap_from_lavc(&sh_audio->channels, codec->channel_layout); - sh_audio->samplerate = codec->sample_rate; - sh_audio->bitrate = codec->bit_rate; + mp_chmap_from_lavc(&sh->codec->channels, codec->channel_layout); + sh->codec->samplerate = codec->sample_rate; + sh->codec->bitrate = codec->bit_rate; - export_replaygain(demuxer, sh_audio, st); + export_replaygain(demuxer, sh->codec, st); break; } case AVMEDIA_TYPE_VIDEO: { sh = demux_alloc_sh_stream(STREAM_VIDEO); - sh_video_t *sh_video = sh->video; if (st->disposition & AV_DISPOSITION_ATTACHED_PIC) { sh->attached_picture = new_demux_packet_from(st->attached_pic.data, @@ -579,8 +578,8 @@ static void handle_new_stream(demuxer_t *demuxer, int i) } } - sh_video->disp_w = codec->width; - sh_video->disp_h = codec->height; + sh->codec->disp_w = codec->width; + sh->codec->disp_h = codec->height; /* Try to make up some frame rate value, even if it's not reliable. * FPS information is needed to support subtitle formats which base * timing on frame numbers. @@ -595,33 +594,31 @@ static void handle_new_stream(demuxer_t *demuxer, int i) fps = 1.0 / FFMAX(av_q2d(st->time_base), av_q2d(st->codec->time_base) * st->codec->ticks_per_frame); - sh_video->fps = fps; + sh->codec->fps = fps; if (priv->format_hack.image_format) - sh_video->fps = demuxer->opts->mf_fps; - sh_video->par_w = st->sample_aspect_ratio.num; - sh_video->par_h = st->sample_aspect_ratio.den; + sh->codec->fps = demuxer->opts->mf_fps; + sh->codec->par_w = st->sample_aspect_ratio.num; + sh->codec->par_h = st->sample_aspect_ratio.den; uint8_t *sd = av_stream_get_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, NULL); if (sd) { double r = av_display_rotation_get((uint32_t *)sd); if (!isnan(r)) - sh_video->rotate = (((int)(-r) % 360) + 360) % 360; + sh->codec->rotate = (((int)(-r) % 360) + 360) % 360; } // This also applies to vfw-muxed mkv, but we can't detect these easily. - sh_video->avi_dts = matches_avinputformat_name(priv, "avi"); + sh->codec->avi_dts = matches_avinputformat_name(priv, "avi"); break; } case AVMEDIA_TYPE_SUBTITLE: { - sh_sub_t *sh_sub; sh = demux_alloc_sh_stream(STREAM_SUB); - sh_sub = sh->sub; if (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; + sh->codec->extradata = talloc_size(sh, codec->extradata_size); + memcpy(sh->codec->extradata, codec->extradata, codec->extradata_size); + sh->codec->extradata_size = codec->extradata_size; } if (matches_avinputformat_name(priv, "microdvd")) { @@ -629,12 +626,12 @@ static void handle_new_stream(demuxer_t *demuxer, int i) if (av_opt_get_q(avfc, "subfps", AV_OPT_SEARCH_CHILDREN, &r) >= 0) { // File headers don't have a FPS set. if (r.num < 1 || r.den < 1) - sh_sub->frame_based = av_q2d(av_inv_q(codec->time_base)); + sh->codec->frame_based = av_q2d(av_inv_q(codec->time_base)); } else { // Older libavformat versions. If the FPS matches the microdvd // reader's default, assume it uses frame based timing. if (codec->time_base.num == 125 && codec->time_base.den == 2997) - sh_sub->frame_based = 23.976; + sh->codec->frame_based = 23.976; } } break; @@ -658,11 +655,11 @@ static void handle_new_stream(demuxer_t *demuxer, int i) if (sh) { sh->ff_index = st->index; - sh->codec = mp_codec_from_av_codec_id(codec->codec_id); - sh->codec_tag = codec->codec_tag; - sh->lav_headers = avcodec_alloc_context3(NULL); - if (sh->lav_headers) - mp_copy_lav_codec_headers(sh->lav_headers, codec); + sh->codec->codec = mp_codec_from_av_codec_id(codec->codec_id); + sh->codec->codec_tag = codec->codec_tag; + sh->codec->lav_headers = avcodec_alloc_context3(NULL); + if (sh->codec->lav_headers) + mp_copy_lav_codec_headers(sh->codec->lav_headers, codec); if (st->disposition & AV_DISPOSITION_DEFAULT) sh->default_track = true; @@ -1104,7 +1101,7 @@ static void demux_close_lavf(demuxer_t *demuxer) av_freep(&priv->pb); for (int n = 0; n < priv->num_streams; n++) { if (priv->streams[n]) - avcodec_free_context(&priv->streams[n]->lav_headers); + avcodec_free_context(&priv->streams[n]->codec->lav_headers); } if (priv->stream != demuxer->stream) free_stream(priv->stream); diff --git a/demux/demux_mf.c b/demux/demux_mf.c index b41bf87aa3..a91d13dff2 100644 --- a/demux/demux_mf.c +++ b/demux/demux_mf.c @@ -165,7 +165,7 @@ static void demux_seek_mf(demuxer_t *demuxer, double rel_seek_secs, int flags) if (flags & SEEK_FACTOR) newpos += rel_seek_secs * (mf->nr_of_files - 1); else - newpos += rel_seek_secs * mf->sh->video->fps; + newpos += rel_seek_secs * mf->sh->codec->fps; if (newpos < 0) newpos = 0; if (newpos >= mf->nr_of_files) @@ -199,7 +199,7 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer) demux_packet_t *dp = new_demux_packet(data.len); if (dp) { memcpy(dp->buffer, data.start, data.len); - dp->pts = mf->curr_frame / mf->sh->video->fps; + dp->pts = mf->curr_frame / mf->sh->codec->fps; dp->keyframe = true; demux_add_packet(mf->sh, dp); } @@ -291,7 +291,6 @@ static const char *probe_format(mf_t *mf, char *type, enum demux_check check) static int demux_open_mf(demuxer_t *demuxer, enum demux_check check) { - sh_video_t *sh_video = NULL; mf_t *mf; if (strncmp(demuxer->stream->url, "mf://", 5) == 0 && @@ -317,12 +316,12 @@ static int demux_open_mf(demuxer_t *demuxer, enum demux_check check) // create a new video stream header struct sh_stream *sh = demux_alloc_sh_stream(STREAM_VIDEO); - sh_video = sh->video; + struct mp_codec_params *c = sh->codec; - sh->codec = codec; - sh_video->disp_w = 0; - sh_video->disp_h = 0; - sh_video->fps = demuxer->opts->mf_fps; + c->codec = codec; + c->disp_w = 0; + c->disp_h = 0; + c->fps = demuxer->opts->mf_fps; demux_add_sh_stream(demuxer, sh); @@ -346,7 +345,7 @@ static int demux_control_mf(demuxer_t *demuxer, int cmd, void *arg) switch (cmd) { case DEMUXER_CTRL_GET_TIME_LENGTH: - *((double *)arg) = (double)mf->nr_of_files / mf->sh->video->fps; + *((double *)arg) = (double)mf->nr_of_files / mf->sh->codec->fps; return DEMUXER_CTRL_OK; default: diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 3951452074..024f7e7e6e 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1201,7 +1201,7 @@ static void add_coverart(struct demuxer *demuxer) continue; struct sh_stream *sh = demux_alloc_sh_stream(STREAM_VIDEO); sh->demuxer_id = -1 - sh->index; // don't clash with mkv IDs - sh->codec = codec; + sh->codec->codec = codec; sh->attached_picture = new_demux_packet_from(att->data, att->data_size); if (sh->attached_picture) { sh->attached_picture->pts = 0; @@ -1273,7 +1273,7 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) unsigned int extradata_size = 0; struct sh_stream *sh = demux_alloc_sh_stream(STREAM_VIDEO); init_track(demuxer, track, sh); - sh_video_t *sh_v = sh->video; + struct mp_codec_params *sh_v = sh->codec; sh_v->bits_per_coded_sample = 24; @@ -1288,11 +1288,11 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) if (track->v_height == 0) track->v_height = AV_RL32(h + 8); // biHeight sh_v->bits_per_coded_sample = AV_RL16(h + 14); // biBitCount - sh->codec_tag = AV_RL32(h + 16); // biCompression + sh_v->codec_tag = AV_RL32(h + 16); // biCompression extradata = track->private_data + 40; extradata_size = track->private_size - 40; - mp_set_codec_from_tag(sh); + mp_set_codec_from_tag(sh_v); sh_v->avi_dts = true; } else if (track->private_size >= RVPROPERTIES_SIZE && (!strcmp(track->codec_id, "V_REAL/RV10") @@ -1308,10 +1308,10 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) cnt = track->private_size - RVPROPERTIES_SIZE; uint32_t t2 = AV_RB32(src - 4); switch (t2 == 0x10003000 || t2 == 0x10003001 ? '1' : track->codec_id[9]) { - case '1': sh->codec = "rv10"; break; - case '2': sh->codec = "rv20"; break; - case '3': sh->codec = "rv30"; break; - case '4': sh->codec = "rv40"; break; + case '1': sh_v->codec = "rv10"; break; + case '2': sh_v->codec = "rv20"; break; + case '3': sh_v->codec = "rv30"; break; + case '4': sh_v->codec = "rv40"; break; } // copy type1 and type2 info from rv properties extradata_size = cnt + 8; @@ -1320,8 +1320,8 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) track->parse_timebase = 1e3; } else if (strcmp(track->codec_id, "V_UNCOMPRESSED") == 0) { // raw video, "like AVI" - this is a FourCC - sh->codec_tag = track->colorspace; - sh->codec = "rawvideo"; + sh_v->codec_tag = track->colorspace; + sh_v->codec = "rawvideo"; } else if (strcmp(track->codec_id, "V_QUICKTIME") == 0) { uint32_t fourcc1 = 0, fourcc2 = 0; if (track->private_size >= 8) { @@ -1331,14 +1331,14 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) if (fourcc1 == MP_FOURCC('S', 'V', 'Q', '3') || fourcc2 == MP_FOURCC('S', 'V', 'Q', '3')) { - sh->codec = "svq3"; + sh_v->codec = "svq3"; extradata = track->private_data; extradata_size = track->private_size; } } else { for (int i = 0; mkv_video_tags[i][0]; i++) { if (!strcmp(mkv_video_tags[i][0], track->codec_id)) { - sh->codec = mkv_video_tags[i][1]; + sh_v->codec = mkv_video_tags[i][1]; break; } } @@ -1348,12 +1348,12 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) } } - const char *codec = sh->codec ? sh->codec : ""; + const char *codec = sh_v->codec ? sh_v->codec : ""; if (!strcmp(codec, "vp9")) { track->parse = true; track->parse_timebase = 1e9; } else if (!strcmp(codec, "mjpeg")) { - sh->codec_tag = MP_FOURCC('m', 'j', 'p', 'g'); + sh_v->codec_tag = MP_FOURCC('m', 'j', 'p', 'g'); } if (extradata_size > 0x1000000) { @@ -1361,9 +1361,9 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track) goto done; } - sh->extradata = talloc_memdup(sh_v, extradata, extradata_size); - sh->extradata_size = extradata_size; - if (!sh->codec) { + sh_v->extradata = talloc_memdup(sh_v, extradata, extradata_size); + sh_v->extradata_size = extradata_size; + if (!sh_v->codec) { MP_WARN(demuxer, "Unknown/unsupported CodecID (%s) or missing/bad " "CodecPrivate data (track %u).\n", track->codec_id, track->tnum); @@ -1477,7 +1477,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) { struct sh_stream *sh = demux_alloc_sh_stream(STREAM_AUDIO); init_track(demuxer, track, sh); - sh_audio_t *sh_a = sh->audio; + struct mp_codec_params *sh_a = sh->codec; if (track->private_size > 0x1000000) goto error; @@ -1492,7 +1492,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) for (int i = 0; mkv_audio_tags[i][0]; i++) { if (!strcmp(mkv_audio_tags[i][0], track->codec_id)) { - sh->codec = mkv_audio_tags[i][1]; + sh_a->codec = mkv_audio_tags[i][1]; break; } } @@ -1503,7 +1503,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) goto error; MP_VERBOSE(demuxer, "track with MS compat audio.\n"); unsigned char *h = track->private_data; - sh->codec_tag = AV_RL16(h + 0); // wFormatTag + sh_a->codec_tag = AV_RL16(h + 0); // wFormatTag if (track->a_channels == 0) track->a_channels = AV_RL16(h + 2); // nChannels if (sh_a->samplerate == 0) @@ -1515,15 +1515,15 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) extradata = track->private_data + 18; extradata_len = track->private_size - 18; sh_a->bits_per_coded_sample = track->a_bps; - mp_set_codec_from_tag(sh); + mp_set_codec_from_tag(sh_a); } else if (!strcmp(track->codec_id, "A_PCM/INT/LIT")) { bool sign = sh_a->bits_per_coded_sample > 8; - mp_set_pcm_codec(sh, sign, false, sh_a->bits_per_coded_sample, false); + mp_set_pcm_codec(sh_a, sign, false, sh_a->bits_per_coded_sample, false); } else if (!strcmp(track->codec_id, "A_PCM/INT/BIG")) { bool sign = sh_a->bits_per_coded_sample > 8; - mp_set_pcm_codec(sh, sign, false, sh_a->bits_per_coded_sample, true); + mp_set_pcm_codec(sh_a, sign, false, sh_a->bits_per_coded_sample, true); } else if (!strcmp(track->codec_id, "A_PCM/FLOAT/IEEE")) { - sh->codec = sh_a->bits_per_coded_sample == 64 ? "pcm_f64le" : "pcm_f32le"; + sh_a->codec = sh_a->bits_per_coded_sample == 64 ? "pcm_f64le" : "pcm_f32le"; } else if (!strncmp(track->codec_id, "A_REAL/", 7)) { if (track->private_size < RAPROPERTIES4_SIZE) goto error; @@ -1563,29 +1563,29 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) extradata = src + offset; if (!strcmp(track->codec_id, "A_REAL/ATRC")) { - sh->codec = "atrac3"; + sh_a->codec = "atrac3"; if (flavor >= MP_ARRAY_SIZE(atrc_fl2bps)) goto error; sh_a->bitrate = atrc_fl2bps[flavor] * 8; sh_a->block_align = track->sub_packet_size; } else if (!strcmp(track->codec_id, "A_REAL/COOK")) { - sh->codec = "cook"; + sh_a->codec = "cook"; if (flavor >= MP_ARRAY_SIZE(cook_fl2bps)) goto error; sh_a->bitrate = cook_fl2bps[flavor] * 8; sh_a->block_align = track->sub_packet_size; } else if (!strcmp(track->codec_id, "A_REAL/SIPR")) { - sh->codec = "sipr"; + sh_a->codec = "sipr"; if (flavor >= MP_ARRAY_SIZE(sipr_fl2bps)) goto error; sh_a->bitrate = sipr_fl2bps[flavor] * 8; sh_a->block_align = track->coded_framesize; } else if (!strcmp(track->codec_id, "A_REAL/28_8")) { - sh->codec = "ra_288"; + sh_a->codec = "ra_288"; sh_a->bitrate = 3600 * 8; sh_a->block_align = track->coded_framesize; } else if (!strcmp(track->codec_id, "A_REAL/DNET")) { - sh->codec = "ac3"; + sh_a->codec = "ac3"; } else { goto error; } @@ -1595,7 +1595,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) track->audio_timestamp = talloc_array(track, double, track->sub_packet_h); } else if (!strncmp(track->codec_id, "A_AAC/", 6)) { - sh->codec = "aac"; + sh_a->codec = "aac"; /* Recreate the 'private data' (not needed for plain A_AAC) */ int srate_idx = aac_get_sample_rate_index(track->a_sfreq); @@ -1627,17 +1627,17 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) track->default_duration = 1024.0 / sh_a->samplerate; } } else if (!strncmp(track->codec_id, "A_AC3/", 6)) { - sh->codec = "ac3"; + sh_a->codec = "ac3"; } else if (!strncmp(track->codec_id, "A_EAC3/", 7)) { - sh->codec = "eac3"; + sh_a->codec = "eac3"; } - if (!sh->codec) + if (!sh_a->codec) goto error; mp_chmap_set_unknown(&sh_a->channels, track->a_channels); - const char *codec = sh->codec; + const char *codec = sh_a->codec; if (!strcmp(codec, "mp3") || !strcmp(codec, "truehd")) { track->parse = true; } else if (!strcmp(codec, "flac")) { @@ -1681,8 +1681,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->extradata = extradata; - sh->extradata_size = extradata_len; + sh_a->extradata = extradata; + sh_a->extradata_size = extradata_len; demux_add_sh_stream(demuxer, sh); @@ -1727,7 +1727,7 @@ static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track) struct sh_stream *sh = demux_alloc_sh_stream(STREAM_SUB); init_track(demuxer, track, sh); - sh->codec = subtitle_type; + sh->codec->codec = subtitle_type; bstr in = (bstr){track->private_data, track->private_size}; bstr buffer = demux_mkv_decode(demuxer->log, track, in, 2); if (buffer.start && buffer.start != track->private_data) { @@ -1736,8 +1736,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->extradata = track->private_data; - sh->extradata_size = track->private_size; + sh->codec->extradata = track->private_data; + sh->codec->extradata_size = track->private_size; demux_add_sh_stream(demuxer, sh); @@ -2027,7 +2027,7 @@ static bool handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, if (!track->audio_buf || !track->audio_timestamp || !track->stream) return false; - const char *codec = track->stream->codec ? track->stream->codec : ""; + const char *codec = track- |