matroskadec.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 2,000 行 · 第 1/5 页

C
2,000
字号
                    if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {                        res = AVERROR(EIO);                        break;                    } else if (matroska->level_up > 0) {                        matroska->level_up--;                        break;                    }                    switch (id) {                        /* samplerate */                        case MATROSKA_ID_AUDIOSAMPLINGFREQ: {                            double num;                            if ((res = ebml_read_float(matroska, &id,                                                       &num)) < 0)                                break;                            audiotrack->internal_samplerate =                            audiotrack->samplerate = num;                            break;                        }                        case MATROSKA_ID_AUDIOOUTSAMPLINGFREQ: {                            double num;                            if ((res = ebml_read_float(matroska, &id,                                                       &num)) < 0)                                break;                            audiotrack->samplerate = num;                            break;                        }                            /* bitdepth */                        case MATROSKA_ID_AUDIOBITDEPTH: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            audiotrack->bitdepth = num;                            break;                        }                            /* channels */                        case MATROSKA_ID_AUDIOCHANNELS: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            audiotrack->channels = num;                            break;                        }                        default:                            av_log(matroska->ctx, AV_LOG_INFO,                                   "Unknown audio track header entry "                                   "0x%x - ignoring\n", id);                            /* pass-through */                        case EBML_ID_VOID:                            res = ebml_read_skip(matroska);                            break;                    }                    if (matroska->level_up) {                        matroska->level_up--;                        break;                    }                }                break;            }                /* codec identifier */            case MATROSKA_ID_CODECID: {                char *text;                if ((res = ebml_read_ascii(matroska, &id, &text)) < 0)                    break;                track->codec_id = text;                break;            }                /* codec private data */            case MATROSKA_ID_CODECPRIVATE: {                uint8_t *data;                int size;                if ((res = ebml_read_binary(matroska, &id, &data, &size) < 0))                    break;                track->codec_priv = data;                track->codec_priv_size = size;                break;            }                /* name of this track */            case MATROSKA_ID_TRACKNAME: {                char *text;                if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)                    break;                track->name = text;                break;            }                /* language (matters for audio/subtitles, mostly) */            case MATROSKA_ID_TRACKLANGUAGE: {                char *text, *end;                if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)                    break;                if ((end = strchr(text, '-')))                    *end = '\0';                if (strlen(text) == 3)                    strcpy(track->language, text);                av_free(text);                break;            }                /* whether this is actually used */            case MATROSKA_ID_TRACKFLAGENABLED: {                uint64_t num;                if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                    break;                if (num)                    track->flags |= MATROSKA_TRACK_ENABLED;                else                    track->flags &= ~MATROSKA_TRACK_ENABLED;                break;            }                /* whether it's the default for this track type */            case MATROSKA_ID_TRACKFLAGDEFAULT: {                uint64_t num;                if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                    break;                if (num)                    track->flags |= MATROSKA_TRACK_DEFAULT;                else                    track->flags &= ~MATROSKA_TRACK_DEFAULT;                break;            }                /* lacing (like MPEG, where blocks don't end/start on frame                 * boundaries) */            case MATROSKA_ID_TRACKFLAGLACING: {                uint64_t num;                if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                    break;                if (num)                    track->flags |= MATROSKA_TRACK_LACING;                else                    track->flags &= ~MATROSKA_TRACK_LACING;                break;            }                /* default length (in time) of one data block in this track */            case MATROSKA_ID_TRACKDEFAULTDURATION: {                uint64_t num;                if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                    break;                track->default_duration = num;                break;            }            case MATROSKA_ID_TRACKCONTENTENCODINGS: {                if ((res = ebml_read_master(matroska, &id)) < 0)                    break;                while (res == 0) {                    if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {                        res = AVERROR(EIO);                        break;                    } else if (matroska->level_up > 0) {                        matroska->level_up--;                        break;                    }                    switch (id) {                        case MATROSKA_ID_TRACKCONTENTENCODING: {                            int encoding_scope = 1;                            if ((res = ebml_read_master(matroska, &id)) < 0)                                break;                            while (res == 0) {                                if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {                                    res = AVERROR(EIO);                                    break;                                } else if (matroska->level_up > 0) {                                    matroska->level_up--;                                    break;                                }                                switch (id) {                                    case MATROSKA_ID_ENCODINGSCOPE: {                                        uint64_t num;                                        if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                                            break;                                        encoding_scope = num;                                        break;                                    }                                    case MATROSKA_ID_ENCODINGTYPE: {                                        uint64_t num;                                        if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                                            break;                                        if (num)                                            av_log(matroska->ctx, AV_LOG_ERROR,                                                   "Unsupported encoding type");                                        break;                                    }                                    case MATROSKA_ID_ENCODINGCOMPRESSION: {                                        if ((res = ebml_read_master(matroska, &id)) < 0)                                            break;                                        while (res == 0) {                                            if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {                                                res = AVERROR(EIO);                                                break;                                            } else if (matroska->level_up > 0) {                                                matroska->level_up--;                                                break;                                            }                                            switch (id) {                                                case MATROSKA_ID_ENCODINGCOMPALGO: {                                                    uint64_t num;                                                    if ((res = ebml_read_uint(matroska, &id, &num)) < 0)                                                        break;                                                    if (num != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP &&#ifdef CONFIG_ZLIB                                                        num != MATROSKA_TRACK_ENCODING_COMP_ZLIB &&#endif#ifdef CONFIG_BZLIB                                                        num != MATROSKA_TRACK_ENCODING_COMP_BZLIB &&#endif                                                        num != MATROSKA_TRACK_ENCODING_COMP_LZO)                                                        av_log(matroska->ctx, AV_LOG_ERROR,                                                               "Unsupported compression algo\n");                                                    track->encoding_algo = num;                                                    break;                                                }                                                case MATROSKA_ID_ENCODINGCOMPSETTINGS: {                                                    uint8_t *data;                                                    int size;                                                    if ((res = ebml_read_binary(matroska, &id, &data, &size) < 0))                                                        break;                                                    track->encoding_settings = data;                                                    track->encoding_settings_len = size;                                                    break;                                                }                                                default:                                                    av_log(matroska->ctx, AV_LOG_INFO,                                                           "Unknown compression header entry "                                                           "0x%x - ignoring\n", id);                                                    /* pass-through */                                                case EBML_ID_VOID:                                                    res = ebml_read_skip(matroska);                                                    break;                                            }                                            if (matroska->level_up) {                                                matroska->level_up--;                                                break;                                            }                                        }                                        break;                                    }                                    default:                                        av_log(matroska->ctx, AV_LOG_INFO,                                               "Unknown content encoding header entry "                                               "0x%x - ignoring\n", id);                                        /* pass-through */                                    case EBML_ID_VOID:                                        res = ebml_read_skip(matroska);                                        break;                                }                                if (matroska->level_up) {                                    matroska->level_up--;                                    break;                                }                            }                            track->encoding_scope = encoding_scope;                            break;                        }                        default:                            av_log(matroska->ctx, AV_LOG_INFO,                                   "Unknown content encodings header entry "                                   "0x%x - ignoring\n", id);                            /* pass-through */                        case EBML_ID_VOID:                            res = ebml_read_skip(matroska);                            break;                    }                    if (matroska->level_up) {                        matroska->level_up--;                        break;                    }                }                break;            }            case MATROSKA_ID_TRACKTIMECODESCALE: {                double num;                if ((res = ebml_read_float(matroska, &id, &num)) < 0)                    break;                track->time_scale = num;                break;            }            default:                av_log(matroska->ctx, AV_LOG_INFO,                       "Unknown track header entry 0x%x - ignoring\n", id);                /* pass-through */            case EBML_ID_VOID:            /* we ignore these because they're nothing useful. */            case MATROSKA_ID_TRACKFLAGFORCED:            case MATROSKA_ID_CODECNAME:            case MATROSKA_ID_CODECDECODEALL:            case MATROSKA_ID_CODECINFOURL:            case MATROSKA_ID_CODECDOWNLOADURL:            case MATROSKA_ID_TRACKMINCACHE:            case MATROSKA_ID_TRACKMAXCACHE:                res = ebml_read_skip(matroska);                break;        }        if (matroska->level_up) {            matroska->level_up--;            break;        }    }    if (track->type && matroska->num_tracks < ARRAY_SIZE(matroska->tracks)) {        matroska->tracks[matroska->num_tracks++] = track;    } else {        av_free(track);    }    return res;}static intmatroska_parse_tracks (MatroskaDemuxContext *matroska){    int res = 0;    uint32_t id;    av_log(matroska->ctx, AV_LOG_DEBUG, "parsing tracks...\n");    while (res == 0) {        if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {            res = AVERROR(EIO);            break;        } else if (matroska->level_up) {            matroska->level_up--;            break;        }        switch (id) {            /* one track within the "all-tracks" header */            case MATROSKA_ID_TRACKENTRY:                res = matroska_add_stream(matroska);                break;            default:                av_log(matroska->ctx, AV_LOG_INFO,                       "Unknown entry 0x%x in track header\n", id);                /* fall-through */            case EBML_ID_VOID:                res = ebml_read_skip(matroska);                break;        }        if (matroska->level_up) {            matroska->level_up--;            break;        }    }    return res;}static intmatroska_parse_index (MatroskaDemuxContext *matroska){    int res = 0;    uint32_t id;    MatroskaDemuxIndex idx;    av_log(matroska->ctx, AV_LOG_DEBUG, "parsing index...\n");    while (res == 0) {        if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {            res = AVERROR(EIO);            break;        } else if (matroska->level_up) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?