{"id":13907662,"url":"https://github.com/DicomJ/mpeg-profiler","last_synced_at":"2025-07-18T06:30:35.118Z","repository":{"id":69585753,"uuid":"154038369","full_name":"DicomJ/mpeg-profiler","owner":"DicomJ","description":"mpeg-isobmf/mp4 profiling library","archived":false,"fork":false,"pushed_at":"2018-11-17T12:13:45.000Z","size":53,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-25T16:39:01.022Z","etag":null,"topics":["14496-12","14496-14","avc","bitstream","codec","cplusplus","hevc","isobmf","library","mp4","mpeg","parser","profiling"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DicomJ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-10-21T18:15:15.000Z","updated_at":"2024-08-17T12:32:25.000Z","dependencies_parsed_at":"2023-03-13T20:25:05.032Z","dependency_job_id":null,"html_url":"https://github.com/DicomJ/mpeg-profiler","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DicomJ/mpeg-profiler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DicomJ%2Fmpeg-profiler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DicomJ%2Fmpeg-profiler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DicomJ%2Fmpeg-profiler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DicomJ%2Fmpeg-profiler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DicomJ","download_url":"https://codeload.github.com/DicomJ/mpeg-profiler/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DicomJ%2Fmpeg-profiler/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265710530,"owners_count":23815373,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["14496-12","14496-14","avc","bitstream","codec","cplusplus","hevc","isobmf","library","mp4","mpeg","parser","profiling"],"created_at":"2024-08-06T23:02:04.568Z","updated_at":"2025-07-18T06:30:34.782Z","avatar_url":"https://github.com/DicomJ.png","language":"C++","funding_links":[],"categories":["HarmonyOS"],"sub_categories":["Windows Manager"],"readme":"# **MPEG-PROFILER** - mpeg-isobmf/mp4 profiling library\n\n## Key features\n\n2. Like [MPEG-ISOBASE](https://github.com/DicomJ/mpeg-isobase) library it's totally use-case agnostic. Provides pure MPEG-ISOBMF/MP4 profiling abilities without superfluous functionality;\n1. Simplified data model represented as `Container` of `Tracks` with `Media::Samples`;\n1. Simplified memory managment what results into a single user faced `std::unique_ptr`. No shared objects (and so responsibilities);\n1. Fine-grained access to the `Box` tree;\n1. Ultrasmart `Media::Samples::Iterator` facilitates access to the timing and data indexing information of the `Media::Samples` in the `Track` and hides all the complexity of iteration over `stbl` related `Box`es;\n1. Seeking abilities with almost O(1) complexity by time in any scale (`mvhd` or `mdhd`) or by time in seconds;\n11. Apart and like [MPEG-ISOBASE](https://github.com/DicomJ/mpeg-isobase) it relies only on pure C++ and C++ Standard Library.\n\n## What's is not\n\n\nIt's not a full featured media stream processing solution which does repackaging. Nevertheless, it's very easy to build such solutions based on MPEG-PROFILER and [MPEG-ISOBASE](https://github.com/DicomJ/mpeg-isobase) libraries. For example:\n\nhttps://github.com/DicomJ/mpeg-packager\n\n## Known limitations:\n\nIt implies the same limitations as [MPEG-ISOBASE](https://github.com/DicomJ/mpeg-isobase) library as it's based on it.\n\n## Building\n\nIf you would like to check out and build MPEG-PROFILER library, the procedure is as follows (requires modern C++17 compiler):\n\n1. Check out MPEG-PROFILER\n\n    ```bash\n    git clone git@github.com:DicomJ/mpeg-profiler.git mpeg-profiler\n    ```\n\n1. Build MPEG-PROFILER\n\n    ```bash\n    mkdir mpeg-profiler/build\n    cd mpeg-profiler/build\n    cmake -DCMAKE_BUILD_TYPE=Release -DCXX_STD=c++17 -DCMAKE_INSTALL_PREFIX=$(pwd)/install $(pwd)/../../mpeg-profiler\n    make install\n    ```\n\n## Usage\n\n### Profiling\n\nAll parsing hard work is done by `mpeg::isobase::Parser` of [MPEG-ISOBASE](https://github.com/DicomJ/mpeg-isobase) library. `Profiler` is just an implementation of `Parser::Observer` which handles corresponding parsing events.\n\n\n```bash\ncat ../../mpeg-profiler/demo/dump.cc\n```\n\n```C++\nbitstream::input::file::Stream stream(\"sample.mp4\");\nmpeg::profiler::Profiler profiler;\nmpeg::isobase::Parser parser(stream, profiler);\n\nparser.parse();\n```\n\n### Container\n\nAs the result of profiling `Container` object is built and could be detached as `std::unique_ptr` off the `Profiler` object:\n\n```C++\nauto container_ptr = profiler.detach_container();\nconst auto \u0026container = *container_ptr;\n```\n\n`Container` object is a root node of `Box` tree starting from which all other `Box`es could be obtained by the following methods (note that all returned types are weak references/pointers to the objects life time of which is determined by `std::unique_ptr` of detached `Container` object):\n\n* traverse to the required `Box` by the subscript `operator []`:\n\n    ```C++\n    const auto \u0026mvhd = container['moov']['mvhd'];\n    ```\n\n* obtain `Box` object casted to its type by counterpart `as` method:\n\n    ```C++\n    const auto \u0026mvhd = container['moov'].as\u003cMovie::Header\u003e('mvhd');\n    ```\n\n* obtain a pointer to the optional `Box` by `get` method. `nullptr` is returned if object is not found:\n\n    ```C++\n    assert(container.get('foo ') == nullptr);\n    ```\n\n* obtain optional object but casted to its type:\n\n    ```C++\n    const Foo *foo = container.get\u003cFoo\u003e('bar ');\n    ```\n\n* if there're more than one `Box` `all` method should be used to iterate over them:\n\n    ```C++\n    for (const auto \u0026track: container['moov'].all\u003cTrack\u003e('trak')) {\n        track['mdia'].as\u003cMedia::Header\u003e('mdhd');\n        // ...\n    }\n    ```\n\n### Tracks\n\n`Container` object itself has a built in methods to iterate over tracks, even though technically tracks are stored under `moov` `Box`:\n\n```C++\ncontainer.tracks(); // all tracks\ncontainer.video_tracks();\ncontainer.audio_tracks();\n```\n\nIn its turn `Track` object has handy methods to figure out the type of track:\n\n```C++\ntrack.is_audio();\ntrack.is_video();\n```\n\n### Samples\n\nConceptually `Track` comprises `Media::Samples`, mostly defined by `stbl` `Box`. So `Track` object has corresponding method to obtain the `Media::Samples` object:\n\n```C++\nconst auto \u0026samples = track.samples();\n```\n\n`Media::Samples` object encapsulates all the details of traversing over `stbl` `Box` by exposing very simple `Sample::Iterator` interface.\n\n```C++\nassert(samples.count() == (samples.end() - samples.begin()));\nfor (auto it = samples.begin(); it != samples.end(); ++it) {\n    // ...\n}\n```\n\n`Samples::Iterator` can be obtained at any `Media::Sample` by its index in the following range \\[0, `samples.count()`) :\n\n```C++\nconst auto \u0026it = samples.at(i);\n```\n\nThen a `Media::Sample` itself can be obtained by dereferencing `Sample::Iterator`:\n\n```C++\nconst auto \u0026sample = *it;\n```\n\nThe `Media::Sample` object provides all the time and data indexing infomation defined by the following interface:\n\n```C++\nstruct Media::Sample {\n    // Timing information\n    Time decoding_time() const;\n    Time composition_time() const;\n\n    // Offset in bytes within media defined by the DataReferenceBox\n    uint64_t offset() const;\n\n    // Size of sample in bytes\n    uint32_t size() const;\n\n    // Sample's metadata\n    const SampleEntry \u0026sample_entry() const;\n    const DependencyType::Entry *dependency() const;    // optional\n\n    // The rest technical indexes and metadata there's no real reason to care about\n    ...\n}\n```\n\n### Seeking\n\n`Media::Samples` object exposes methods which allow to seek by time in `mdhd` or `mvhd` timescales or by time in seconds. As the result index of the `Media::Sample` is returned. The following example demonstrates how to iterate over all `Media::samples` in all `Track`s from 5.7s up to 6.3s:\n\n```C++\nfor (const auto \u0026track: container.tracks()) {\n    const auto begin = samples.seek(5.7), end = samples.seek(6.3);\n    auto i = 0;\n    for (auto it = samples.at(begin); it != end; ++it) {\n        const auto \u0026sample = *it;\n        std::cout\n            \u003c\u003c \"#\" \u003c\u003c std::setw(3) \u003c\u003c std::left \u003c\u003c  i++ \u003c\u003c \": [\"\n            \u003c\u003c \"time: \" \u003c\u003c sample.decoding_time().seconds() \u003c\u003c \"s, \"\n            \u003c\u003c \"size: \" \u003c\u003c sample.size() \u003c\u003c \" bytes, \"\n            \u003c\u003c \"offset: \" \u003c\u003c sample.offset() \u003c\u003c \" bytes]\" \u003c\u003c std::endl;\n    }\n}\n```\n\nNote that by default Sync Sample Table is used to locate real random access point (RAP) prior sample determined by given time. What means that unlike in this example and first of all seeking should happen on the video `Track` to determine the time boundaries of the segment aligned by random access points of the video `Track`, and only then do seeking on the rest required audio and other `Track`s which has more fine-grained alignment of RAPs. Checkout the output of this example:\n\n```\nsoun: 26 samples:\n#0  : [time: 5.69s, size: 213 bytes, offset: 392953 bytes]\n#1  : [time: 5.71s, size: 206 bytes, offset: 393166 bytes]\n#2  : [time: 5.74s, size: 194 bytes, offset: 393372 bytes]\n#3  : [time: 5.76s, size: 209 bytes, offset: 393566 bytes]\n#4  : [time: 5.78s, size: 201 bytes, offset: 393775 bytes]\n...\n#21 : [time: 6.18s, size: 206 bytes, offset: 443427 bytes]\n#22 : [time: 6.20s, size: 231 bytes, offset: 443633 bytes]\n#23 : [time: 6.22s, size: 193 bytes, offset: 443864 bytes]\n#24 : [time: 6.25s, size: 202 bytes, offset: 444057 bytes]\n#25 : [time: 6.27s, size: 220 bytes, offset: 444259 bytes]\nvide: 24 samples:\n#0  : [time: 4.99s, size: 22215 bytes, offset: 327198 bytes]\n#1  : [time: 5.03s, size: 3488 bytes, offset: 349413 bytes]\n#2  : [time: 5.08s, size: 1373 bytes, offset: 352901 bytes]\n#3  : [time: 5.12s, size: 1604 bytes, offset: 354274 bytes]\n#4  : [time: 5.16s, size: 1707 bytes, offset: 355878 bytes]\n...\n#18 : [time: 5.74s, size: 2913 bytes, offset: 399832 bytes]\n#19 : [time: 5.78s, size: 1939 bytes, offset: 402745 bytes]\n#20 : [time: 5.82s, size: 2232 bytes, offset: 404684 bytes]\n#21 : [time: 5.87s, size: 2316 bytes, offset: 406916 bytes]\n#22 : [time: 5.91s, size: 2383 bytes, offset: 409232 bytes]\n#23 : [time: 5.95s, size: 2374 bytes, offset: 411615 bytes]\n```\n\n`no_sync=true` could be specified while seeking to avoid alignment on RAPs:\n\n```C++\nconst auto begin = samples.seek(5.7, no_sync=true), end = samples.seek(6.3, no_sync=true);\n```\n\nThe result is still the same 26 audio samples, and only 14 video samples, started from and ended with not aligned RAPs in the video `Track`:\n\n```\nsoun: 26 samples:\n#0  : [time: 5.69s, size: 213 bytes, offset: 392953 bytes]\n#1  : [time: 5.71s, size: 206 bytes, offset: 393166 bytes]\n#2  : [time: 5.74s, size: 194 bytes, offset: 393372 bytes]\n#3  : [time: 5.76s, size: 209 bytes, offset: 393566 bytes]\n#4  : [time: 5.78s, size: 201 bytes, offset: 393775 bytes]\n...\n#21 : [time: 6.18s, size: 206 bytes, offset: 443427 bytes]\n#22 : [time: 6.20s, size: 231 bytes, offset: 443633 bytes]\n#23 : [time: 6.22s, size: 193 bytes, offset: 443864 bytes]\n#24 : [time: 6.25s, size: 202 bytes, offset: 444057 bytes]\n#25 : [time: 6.27s, size: 220 bytes, offset: 444259 bytes]\nvide: 14 samples:\n#0  : [time: 5.70s, size: 2889 bytes, offset: 396943 bytes]\n#1  : [time: 5.74s, size: 2913 bytes, offset: 399832 bytes]\n#2  : [time: 5.78s, size: 1939 bytes, offset: 402745 bytes]\n#3  : [time: 5.82s, size: 2232 bytes, offset: 404684 bytes]\n#4  : [time: 5.87s, size: 2316 bytes, offset: 406916 bytes]\n...\n#9  : [time: 6.07s, size: 1094 bytes, offset: 439393 bytes]\n#10 : [time: 6.12s, size: 1255 bytes, offset: 440487 bytes]\n#11 : [time: 6.16s, size: 1264 bytes, offset: 441742 bytes]\n#12 : [time: 6.20s, size: 1308 bytes, offset: 447492 bytes]\n#13 : [time: 6.24s, size: 1361 bytes, offset: 448800 bytes]\n```\n\n## What else?\n\n1. Entire container can be dumped by the following few lines of code:\n\n    ```bash\n    cat ../../mpeg-profiler/demo/dump.cc\n    ```\n\n    ```C++\n    auto container_ptr = profiler.detach_container();\n    const auto \u0026container = *container_ptr;\n    bitstream::output::print::to_stdout \u003c\u003c container;\n    ```\n\n2. Build and run it:\n\n    ```bash\n    g++ \\\n        -o dump \\\n        -std=c++17 -Wno-multichar \\\n        -I install/include \\\n        -Wl,-rpath,$(pwd)/install/lib64 install/lib64/*.so \\\n        ../../mpeg-profiler/demo/dump.cc\n    time ./dump sample.mp4\n    ```\n\n3. Check out the output\n\n    ```\n    |  Container: [major_brand: mp42, minor_version: 1, compatible_brands: [mp42, avc1]]\n    |  Data: [size: 5229792 bytes in 2 'mdat' boxes]\n    +- Movie [duration: 36048/600=60.08s, created: Wed Mar 16 10:41:51 2011, modified: Wed Mar 16 10:42:48 2011]\n    |  +- Track(soun) [duration: 36048/600=60.08s, created: Wed Mar 16 10:41:53 2011, modified: Wed Mar 16 10:42:48 2011]\n    |  |  +- Edit List: [duration: 36048/600=60.08s, time: 0/44100=0.00s, rate: 1.00]\n    |  |  +- Media [duration: 2652160/44100=60.14s, language: English, created: Wed Mar 16 10:41:53 2011, modified: Wed Mar 16 10:42:48 2011]\n    |  |  |  +- Samples [\n    |  |  |  |      Decoding times: [duration: 2652160/44100=60.14s, 2590 samples (in 1 entry)],\n    |  |  |  |      Descriptions: [1 entry,  mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00],\n    |  |  |  |      Sizes: [2590 samples, total size: 470957 bytes (9.01%)],\n    |  |  |  |      Samples to chunks: [2590 samples (in 236 runs)],\n    |  |  |  |      Chunks (offsets): [236 chunks],\n    |  |  |  |  ]\n    |  |  |  |  #0:\n    |  |  |  |      size: 4 bytes\n    |  |  |  |      decoding: [#0: time: 0/44100=0.00s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 0/44100=0.00s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 44558 bytes]\n    |  |  |  |      offset: [44558 bytes, #0 samples in #0 chunck of 14 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #1:\n    |  |  |  |      size: 56 bytes\n    |  |  |  |      decoding: [#0: time: 1024/44100=0.02s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 1024/44100=0.02s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 44558 bytes]\n    |  |  |  |      offset: [44562 bytes, #1 samples in #0 chunck of 14 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #2:\n    |  |  |  |      size: 200 bytes\n    |  |  |  |      decoding: [#0: time: 2048/44100=0.05s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 2048/44100=0.05s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 44558 bytes]\n    |  |  |  |      offset: [44618 bytes, #2 samples in #0 chunck of 14 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #3:\n    |  |  |  |      size: 264 bytes\n    |  |  |  |      decoding: [#0: time: 3072/44100=0.07s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 3072/44100=0.07s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 44558 bytes]\n    |  |  |  |      offset: [44818 bytes, #3 samples in #0 chunck of 14 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #4:\n    |  |  |  |      size: 221 bytes\n    |  |  |  |      decoding: [#0: time: 4096/44100=0.09s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 4096/44100=0.09s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 44558 bytes]\n    |  |  |  |      offset: [45082 bytes, #4 samples in #0 chunck of 14 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |\n    |  |  |  |  ...\n    |  |  |  |\n    |  |  |  |  #2585:\n    |  |  |  |      size: 143 bytes\n    |  |  |  |      decoding: [#0: time: 2647040/44100=60.02s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 2647040/44100=60.02s]\n    |  |  |  |      chunk: [#234: first_index: 234, index: 234, offset: 5170386 bytes]\n    |  |  |  |      offset: [5172369 bytes, #11 samples in #0 chunck of 13 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #2586:\n    |  |  |  |      size: 61 bytes\n    |  |  |  |      decoding: [#0: time: 2648064/44100=60.05s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 2648064/44100=60.05s]\n    |  |  |  |      chunk: [#234: first_index: 234, index: 234, offset: 5170386 bytes]\n    |  |  |  |      offset: [5172512 bytes, #12 samples in #0 chunck of 13 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #2587:\n    |  |  |  |      size: 4 bytes\n    |  |  |  |      decoding: [#0: time: 2649088/44100=60.07s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 2649088/44100=60.07s]\n    |  |  |  |      chunk: [#235: first_index: 235, index: 235, offset: 5172573 bytes]\n    |  |  |  |      offset: [5172573 bytes, #0 samples in #0 chunck of 3 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #2588:\n    |  |  |  |      size: 4 bytes\n    |  |  |  |      decoding: [#0: time: 2650112/44100=60.09s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 2650112/44100=60.09s]\n    |  |  |  |      chunk: [#235: first_index: 235, index: 235, offset: 5172573 bytes]\n    |  |  |  |      offset: [5172577 bytes, #1 samples in #0 chunck of 3 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  |  |  |  #2589:\n    |  |  |  |      size: 4 bytes\n    |  |  |  |      decoding: [#0: time: 2651136/44100=60.12s]\n    |  |  |  |      composition: [offset: 0/44100=0.00s, time: 2651136/44100=60.12s]\n    |  |  |  |      chunk: [#235: first_index: 235, index: 235, offset: 5172573 bytes]\n    |  |  |  |      offset: [5172581 bytes, #2 samples in #0 chunck of 3 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: mp4a, reference: [#0: \u003csame file\u003e], channels: 2, sample size: 16, sample rate: 44100.00]\n    |  +- Track(vide) [duration: 36048/600=60.08s, resolution: 640.00x360.00, created: Wed Mar 16 10:41:52 2011, modified: Wed Mar 16 10:42:48 2011]\n    |  |  +- Edit List: [duration: 36048/600=60.08s, time: 0/2500=0.00s, rate: 1.00]\n    |  |  +- Media [duration: 150280/2500=60.11s, language: English, created: Wed Mar 16 10:41:52 2011, modified: Wed Mar 16 10:42:48 2011]\n    |  |  |  +- Samples [\n    |  |  |  |      Decoding times: [duration: 150280/2500=60.11s, 1445 samples (in 1 entry)],\n    |  |  |  |      Descriptions: [1 entry,  avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1],\n    |  |  |  |      Sizes: [1445 samples, total size: 4758819 bytes (90.99%)],\n    |  |  |  |      Samples to chunks: [1445 samples (in 11 runs)],\n    |  |  |  |      Chunks (offsets): [119 chunks],\n    |  |  |  |      Sync samples: [61 entries],\n    |  |  |  |  ]\n    |  |  |  |  #0:\n    |  |  |  |      size: 28627 bytes\n    |  |  |  |      decoding: [#0: time: 0/2500=0.00s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 0/2500=0.00s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 40 bytes]\n    |  |  |  |      offset: [40 bytes, #0 samples in #0 chunck of 5 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #1:\n    |  |  |  |      size: 12533 bytes\n    |  |  |  |      decoding: [#0: time: 104/2500=0.04s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 104/2500=0.04s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 40 bytes]\n    |  |  |  |      offset: [28667 bytes, #1 samples in #0 chunck of 5 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #2:\n    |  |  |  |      size: 1239 bytes\n    |  |  |  |      decoding: [#0: time: 208/2500=0.08s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 208/2500=0.08s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 40 bytes]\n    |  |  |  |      offset: [41200 bytes, #2 samples in #0 chunck of 5 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #3:\n    |  |  |  |      size: 1024 bytes\n    |  |  |  |      decoding: [#0: time: 312/2500=0.12s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 312/2500=0.12s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 40 bytes]\n    |  |  |  |      offset: [42439 bytes, #3 samples in #0 chunck of 5 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #4:\n    |  |  |  |      size: 1095 bytes\n    |  |  |  |      decoding: [#0: time: 416/2500=0.17s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 416/2500=0.17s]\n    |  |  |  |      chunk: [#0: first_index: 0, index: 0, offset: 40 bytes]\n    |  |  |  |      offset: [43463 bytes, #4 samples in #0 chunck of 5 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |\n    |  |  |  |  ...\n    |  |  |  |\n    |  |  |  |  #1440:\n    |  |  |  |      size: 34173 bytes\n    |  |  |  |      decoding: [#0: time: 149760/2500=59.90s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 149760/2500=59.90s]\n    |  |  |  |      chunk: [#10: first_index: 118, index: 118, offset: 5172585 bytes]\n    |  |  |  |      offset: [5188518 bytes, #5 samples in #0 chunck of 10 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #1441:\n    |  |  |  |      size: 1573 bytes\n    |  |  |  |      decoding: [#0: time: 149864/2500=59.95s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 149864/2500=59.95s]\n    |  |  |  |      chunk: [#10: first_index: 118, index: 118, offset: 5172585 bytes]\n    |  |  |  |      offset: [5222691 bytes, #6 samples in #0 chunck of 10 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #1442:\n    |  |  |  |      size: 3000 bytes\n    |  |  |  |      decoding: [#0: time: 149968/2500=59.99s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 149968/2500=59.99s]\n    |  |  |  |      chunk: [#10: first_index: 118, index: 118, offset: 5172585 bytes]\n    |  |  |  |      offset: [5224264 bytes, #7 samples in #0 chunck of 10 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #1443:\n    |  |  |  |      size: 1588 bytes\n    |  |  |  |      decoding: [#0: time: 150072/2500=60.03s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 150072/2500=60.03s]\n    |  |  |  |      chunk: [#10: first_index: 118, index: 118, offset: 5172585 bytes]\n    |  |  |  |      offset: [5227264 bytes, #8 samples in #0 chunck of 10 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    |  |  |  |  #1444:\n    |  |  |  |      size: 964 bytes\n    |  |  |  |      decoding: [#0: time: 150176/2500=60.07s]\n    |  |  |  |      composition: [offset: 0/2500=0.00s, time: 150176/2500=60.07s]\n    |  |  |  |      chunk: [#10: first_index: 118, index: 118, offset: 5172585 bytes]\n    |  |  |  |      offset: [5228852 bytes, #9 samples in #0 chunck of 10 sampleses in run of 1 chunk]\n    |  |  |  |      description: [#0: avc1, reference: [#0: \u003csame file\u003e], compressor: \u003cundetermined\u003e, 640 x 360, resolution: 72.00 x 72.00, frames per sample: 1]\n    ```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDicomJ%2Fmpeg-profiler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FDicomJ%2Fmpeg-profiler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDicomJ%2Fmpeg-profiler/lists"}