⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matroska.c

📁 ffmpeg源码分析
💻 C
📖 第 1 页 / 共 5 页
字号:
                    res = AVERROR_INVALIDDATA;                    break;                } else if ((res = ebml_read_master(matroska, &id)) < 0)                    break;                videotrack = (MatroskaVideoTrack *)track;                while (res == 0) {                    if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {                        res = AVERROR_IO;                        break;                    } else if (matroska->level_up > 0) {                        matroska->level_up--;                        break;                    }                    switch (id) {                        /* fixme, this should be one-up, but I get it here */                        case MATROSKA_ID_TRACKDEFAULTDURATION: {                            uint64_t num;                            if ((res = ebml_read_uint (matroska, &id,                                                       &num)) < 0)                                break;                            track->default_duration = num;                            break;                        }                        /* video framerate */                        case MATROSKA_ID_VIDEOFRAMERATE: {                            double num;                            if ((res = ebml_read_float(matroska, &id,                                                       &num)) < 0)                                break;                            track->default_duration = 1000000000 * (1. / num);                            break;                        }                        /* width of the size to display the video at */                        case MATROSKA_ID_VIDEODISPLAYWIDTH: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            videotrack->display_width = num;                            break;                        }                        /* height of the size to display the video at */                        case MATROSKA_ID_VIDEODISPLAYHEIGHT: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            videotrack->display_height = num;                            break;                        }                        /* width of the video in the file */                        case MATROSKA_ID_VIDEOPIXELWIDTH: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            videotrack->pixel_width = num;                            break;                        }                        /* height of the video in the file */                        case MATROSKA_ID_VIDEOPIXELHEIGHT: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            videotrack->pixel_height = num;                            break;                        }                        /* whether the video is interlaced */                        case MATROSKA_ID_VIDEOFLAGINTERLACED: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            if (num)                                track->flags |=                                    MATROSKA_VIDEOTRACK_INTERLACED;                            else                                track->flags &=                                    ~MATROSKA_VIDEOTRACK_INTERLACED;                            break;                        }                        /* stereo mode (whether the video has two streams,                         * where one is for the left eye and the other for                         * the right eye, which creates a 3D-like                         * effect) */                        case MATROSKA_ID_VIDEOSTEREOMODE: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            if (num != MATROSKA_EYE_MODE_MONO &&                                num != MATROSKA_EYE_MODE_LEFT &&                                num != MATROSKA_EYE_MODE_RIGHT &&                                num != MATROSKA_EYE_MODE_BOTH) {                                av_log(matroska->ctx, AV_LOG_INFO,                                       "Ignoring unknown eye mode 0x%x\n",                                       (uint32_t) num);                                break;                            }                            videotrack->eye_mode = num;                            break;                        }                        /* aspect ratio behaviour */                        case MATROSKA_ID_VIDEOASPECTRATIO: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            if (num != MATROSKA_ASPECT_RATIO_MODE_FREE &&                                num != MATROSKA_ASPECT_RATIO_MODE_KEEP &&                                num != MATROSKA_ASPECT_RATIO_MODE_FIXED) {                                av_log(matroska->ctx, AV_LOG_INFO,                                       "Ignoring unknown aspect ratio 0x%x\n",                                       (uint32_t) num);                                break;                            }                            videotrack->ar_mode = num;                            break;                        }                        /* colourspace (only matters for raw video)                         * fourcc */                        case MATROSKA_ID_VIDEOCOLOURSPACE: {                            uint64_t num;                            if ((res = ebml_read_uint(matroska, &id,                                                      &num)) < 0)                                break;                            videotrack->fourcc = num;                            break;                        }                        default:                            av_log(matroska->ctx, AV_LOG_INFO,                                   "Unknown video 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;            }            /* tracktype specific stuff for audio */            case MATROSKA_ID_TRACKAUDIO: {                MatroskaAudioTrack *audiotrack;                if (track->type != MATROSKA_TRACK_TYPE_AUDIO) {                    av_log(matroska->ctx, AV_LOG_INFO,                           "audio data in non-audio track - ignoring\n");                    res = AVERROR_INVALIDDATA;                    break;                } else if ((res = ebml_read_master(matroska, &id)) < 0)                    break;                audiotrack = (MatroskaAudioTrack *)track;                while (res == 0) {                    if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {                        res = AVERROR_IO;                        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->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 the codec */            case MATROSKA_ID_CODECNAME: {                char *text;                if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)                    break;                track->codec_name = text;                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;                if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)                    break;                track->language = 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;            }            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_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;        }    }    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_IO;            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_IO;            break;        } else if (matroska->level_up) {            matroska->level_up--;            break;        }        switch (id) {            /* one single index entry ('point') */            case MATROSKA_ID_POINTENTRY:

⌨️ 快捷键说明

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