|
|
|
@@ -1512,31 +1512,69 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type |
|
|
|
} |
|
|
|
break; |
|
|
|
case 0x59: /* subtitling descriptor */ |
|
|
|
language[0] = get8(pp, desc_end); |
|
|
|
language[1] = get8(pp, desc_end); |
|
|
|
language[2] = get8(pp, desc_end); |
|
|
|
language[3] = 0; |
|
|
|
/* hearing impaired subtitles detection */ |
|
|
|
switch(get8(pp, desc_end)) { |
|
|
|
case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */ |
|
|
|
case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */ |
|
|
|
case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */ |
|
|
|
case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */ |
|
|
|
case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */ |
|
|
|
case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */ |
|
|
|
st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; |
|
|
|
break; |
|
|
|
} |
|
|
|
if (st->codec->extradata) { |
|
|
|
if (st->codec->extradata_size == 4 && memcmp(st->codec->extradata, *pp, 4)) |
|
|
|
avpriv_request_sample(fc, "DVB sub with multiple IDs"); |
|
|
|
} else { |
|
|
|
if (!ff_alloc_extradata(st->codec, 4)) { |
|
|
|
memcpy(st->codec->extradata, *pp, 4); |
|
|
|
{ |
|
|
|
/* 8 bytes per DVB subtitle substream data: |
|
|
|
* ISO_639_language_code (3 bytes), |
|
|
|
* subtitling_type (1 byte), |
|
|
|
* composition_page_id (2 bytes), |
|
|
|
* ancillary_page_id (2 bytes) */ |
|
|
|
int language_count = desc_len / 8; |
|
|
|
|
|
|
|
if (desc_len > 0 && desc_len % 8 != 0) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
if (language_count > 1) { |
|
|
|
avpriv_request_sample(fc, "DVB subtitles with multiple languages"); |
|
|
|
} |
|
|
|
|
|
|
|
if (language_count > 0) { |
|
|
|
uint8_t *extradata; |
|
|
|
|
|
|
|
/* 4 bytes per language code (3 bytes) with comma or NUL byte should fit language buffer */ |
|
|
|
if (language_count > sizeof(language) / 4) { |
|
|
|
language_count = sizeof(language) / 4; |
|
|
|
} |
|
|
|
|
|
|
|
if (st->codec->extradata == NULL) { |
|
|
|
if (ff_alloc_extradata(st->codec, language_count * 5)) { |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (st->codec->extradata_size < language_count * 5) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
extradata = st->codec->extradata; |
|
|
|
|
|
|
|
for (i = 0; i < language_count; i++) { |
|
|
|
language[i * 4 + 0] = get8(pp, desc_end); |
|
|
|
language[i * 4 + 1] = get8(pp, desc_end); |
|
|
|
language[i * 4 + 2] = get8(pp, desc_end); |
|
|
|
language[i * 4 + 3] = ','; |
|
|
|
|
|
|
|
/* hearing impaired subtitles detection using subtitling_type */ |
|
|
|
switch(*pp[0]) { |
|
|
|
case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */ |
|
|
|
case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */ |
|
|
|
case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */ |
|
|
|
case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */ |
|
|
|
case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */ |
|
|
|
case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */ |
|
|
|
st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
extradata[4] = get8(pp, desc_end); /* subtitling_type */ |
|
|
|
memcpy(extradata, *pp, 4); /* composition_page_id and ancillary_page_id */ |
|
|
|
extradata += 5; |
|
|
|
|
|
|
|
*pp += 4; |
|
|
|
} |
|
|
|
|
|
|
|
language[i * 4 - 1] = 0; |
|
|
|
av_dict_set(&st->metadata, "language", language, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
*pp += 4; |
|
|
|
av_dict_set(&st->metadata, "language", language, 0); |
|
|
|
break; |
|
|
|
case 0x0a: /* ISO 639 language descriptor */ |
|
|
|
for (i = 0; i + 4 <= desc_len; i += 4) { |
|
|
|
|