diff options
Diffstat (limited to 'media/libnestegg/src/nestegg.c')
-rw-r--r-- | media/libnestegg/src/nestegg.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/media/libnestegg/src/nestegg.c b/media/libnestegg/src/nestegg.c index 61c30ec6b..051bc50fa 100644 --- a/media/libnestegg/src/nestegg.c +++ b/media/libnestegg/src/nestegg.c @@ -157,6 +157,8 @@ enum ebml_type_enum { #define TRACK_ID_AV1 "V_AV1" #define TRACK_ID_VORBIS "A_VORBIS" #define TRACK_ID_OPUS "A_OPUS" +#define TRACK_ID_AVC1 "V_MPEG4/ISO/AVC" +#define TRACK_ID_AAC "A_AAC" /* Track Encryption */ #define CONTENT_ENC_ALGO_AES 5 @@ -2401,6 +2403,12 @@ nestegg_track_codec_id(nestegg * ctx, unsigned int track) if (strcmp(codec_id, TRACK_ID_OPUS) == 0) return NESTEGG_CODEC_OPUS; + if (strcmp(codec_id, TRACK_ID_AVC1) == 0) + return NESTEGG_CODEC_AVC1; + + if (strcmp(codec_id, TRACK_ID_AAC) == 0) + return NESTEGG_CODEC_AAC; + return NESTEGG_CODEC_UNKNOWN; } @@ -2421,7 +2429,8 @@ nestegg_track_codec_data_count(nestegg * ctx, unsigned int track, codec_id = nestegg_track_codec_id(ctx, track); - if (codec_id == NESTEGG_CODEC_OPUS) { + if (codec_id == NESTEGG_CODEC_OPUS || + codec_id == NESTEGG_CODEC_AAC) { *count = 1; return 0; } @@ -2459,7 +2468,9 @@ nestegg_track_codec_data(nestegg * ctx, unsigned int track, unsigned int item, return -1; if (nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_VORBIS && - nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_OPUS) + nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_OPUS && + nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_AVC1 && + nestegg_track_codec_id(ctx, track) != NESTEGG_CODEC_AAC) return -1; if (ne_get_binary(entry->codec_private, &codec_private) != 0) @@ -2772,6 +2783,19 @@ nestegg_read_packet(nestegg * ctx, nestegg_packet ** pkt) if (r != 1) return r; + /* Some files have a crc32 element, since it also has to be first it + conflicts with the timecode spec. Just ignore it */ + if (id == ID_CRC32) { + ctx->log(ctx, NESTEGG_LOG_DEBUG, + "read_packet: skipping crc element in a cluster"); + r = ne_io_read_skip(ctx->io, size); + if (r != 1) + return r; + r = ne_read_element(ctx, &id, &size); + if (r != 1) + return r; + } + /* Timecode must be the first element in a Cluster, per spec. */ if (id != ID_TIMECODE) return -1; |