int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int
stream_type,
const uint8_t **pp, const uint8_t
*desc_list_end,
Mp4Descr *mp4_descr, int mp4_descr_count, int
pid,
@@ -1887,9 +1898,56 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc,
AVStream *st, int stream_type
st->codecpar->extradata[18] = channel_config_code ?
(channels > 2) : /* Dual Mono */ 255;
st->codecpar->extradata[19] =
opus_stream_cnt[channel_config_code];
st->codecpar->extradata[20] =
opus_coupled_stream_cnt[channel_config_code];
- memcpy(&st->codecpar->extradata[21],
opus_channel_map[channels - 1], channels);
+ memcpy(&st->codecpar->extradata[21],
opus_channel_map_a[channels - 1], channels);
} else {
- avpriv_request_sample(fc, "Opus in MPEG-TS - channel_config_code
> 0x8");
+ if (channel_config_code == 0x81) {
+ channels = get8(pp, desc_end);
+ st->codecpar->extradata_size = 22 + channels;
+ size_t extradata_size;
+ extradata_size = (22 + channels) * sizeof(uint8_t);
+ uint8_t *extradata;
this produces warnings:
libavformat/mpegts.c:1906:25: warning: ISO C90 forbids mixed declarations and
code [-Wdeclaration-after-statement]
Thanks a lot Michael for your review.
I have cleaned this warning and others issued by gcc.
+ extradata = av_malloc(extradata_size);
+ if (!extradata)
+ return AVERROR(ENOMEM);
+ for (i = 0; i <= (22+channels); i++) {
the extradata_size expression is repeated 3 times, code duplication
should be avoided
removed
+ if (i < 9) {
+ extradata[i] = opus_default_extradata[i];
+ }
+ else {
+ extradata[i] = 0;
+ }
+ }
+ memcpy(st->codecpar->extradata, extradata,
sizeof(extradata));
this looks wrong
right, fixed (removed)
+ av_free(extradata);
+ st->codecpar->extradata[9] = channels;
+ st->codecpar->extradata[18] = 255;
+ st->codecpar->extradata[19] = channels;
+ st->codecpar->extradata[20] = 0;
+ size_t channel_map_size = channels * sizeof(uint8_t);
+ uint8_t *opus_channel_map255;
+ opus_channel_map255 = av_malloc(channel_map_size);
+ if (!opus_channel_map255)
+ return AVERROR(ENOMEM);
+ uint8_t j;
+ for (j = 0; j < channels; j++) {
+ opus_channel_map255[j] = j;
+ }
+ memcpy(&st->codecpar->extradata[21],
opus_channel_map255, channels);
+ av_free(opus_channel_map255);
+ } else {
+ if ((channel_config_code >= 0x82) && (channel_config_code
<= 0x88)) {
+ channels = get8(pp, desc_end);
+ st->codecpar->extradata[9] = channels;
+ st->codecpar->extradata[18] = 1;
+ st->codecpar->extradata[19] = channels;
+ st->codecpar->extradata[20] = 0;
+ memcpy(&st->codecpar->extradata[21],
opus_channel_map_b[channels - 1], channels);
the channels value is not checked before use in memcpy
fixed;
I have added other checks for all the data read from header;
+ }
+ else {
+ avpriv_request_sample(fc, "Opus in MPEG-TS -
channel_config_code %i", channel_config_code);
+ }
+
+ }
}
st->need_parsing = AVSTREAM_PARSE_FULL;
st->internal->need_context_update = 1;
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index fdfa544..af1dfc6 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
muxer and demuxer changes should be in seperate patches
done; see next posts.
My previous code was not following strictly the draft spec here:
https://people.xiph.org/~tterribe/opus/ETSI_TS_opus-v0.1.3-draft.doc
So I have rewritten it to have strict adherence regarding the bits
allocated in header.
I have also run fate + patcheck ; no issues (just some unused variables
warnings for variables antedating this patch).
Regards
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel