libeplayer3: ffmpeg now provides teletext details in codec->extradata

This commit is contained in:
martii
2014-04-11 14:11:36 +02:00
parent 6c594a7cda
commit 1a808def2f

View File

@@ -483,21 +483,18 @@ bool Input::UpdateTracks()
} }
case AVMEDIA_TYPE_SUBTITLE: { case AVMEDIA_TYPE_SUBTITLE: {
if (stream->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT) { if (stream->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
int i = 0; std::string l = lang ? lang->value : "";
AVDictionaryEntry *t = NULL; uint8_t *data = stream->codec->extradata;
do { int size = stream->codec->extradata_size;
char tmp[30]; if (size > 0 && 2 * size - 1 == l.length()) {
snprintf(tmp, sizeof(tmp), "teletext_%d", i); for (unsigned i = 0; i < size; i += 2) {
t = av_dict_get(stream->metadata, tmp, NULL, 0); track.Name = l.substr(i * 2, 3);
if (t) { track.type = data[i] >> 3;
char language[strlen(t->value)]; track.mag = data[i] & 7;
if (4 == sscanf(t->value, "%*d %s %d %d %d", language, &track.type, &track.mag, &track.page)) { track.page = data[i + 1];
track.Name = language;
player->manager.addTeletextTrack(track); player->manager.addTeletextTrack(track);
} }
} }
i++;
} while (t);
} else { } else {
if (!stream->codec->codec) { if (!stream->codec->codec) {
stream->codec->codec = avcodec_find_decoder(stream->codec->codec_id); stream->codec->codec = avcodec_find_decoder(stream->codec->codec_id);