# yetote/mp4info architecture

> Architecture diagram of the GitHub repository yetote/mp4info, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/yetote/mp4info
- Repository: https://github.com/yetote/mp4info

## Overview

This is an Android MP4 inspection app. A user selects a file, starts parsing, expands the MP4 box tree, and selects boxes to inspect their decoded fields and raw data. The Java parser scans box structure and dispatches box-specific readers; decoded field data is queued for incremental display. The graph reflects documented imports and the shown parser/queue calls. The README is empty, and some activity code is omitted, so uncertain wiring—especially the native C++ reader—is not asserted.

Main entry points: [`app/src/main/java/com/yetote/mp4info/MainActivity.java`](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/MainActivity.java) (Main activity), [`app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java`](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java) (NIO scanner), [`app/src/main/java/com/yetote/mp4info/bean`](https://github.com/yetote/mp4info/tree/master/app/src/main/java/com/yetote/mp4info/bean) (Box decoders), [`app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java`](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java) (Box tree adapter)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Android UI"]
  node_activity["Main activity<br/>[MainActivity.java]"]
  node_tree["Box tree adapter"]
  node_describe["Description view"]
end

subgraph group_parse["MP4 Parsing"]
  node_fileutil["File access"]
  node_readinfo["Read interface<br/>[ReadInfo.java]"]
  node_scanner["NIO scanner<br/>[NIOReadInfo.java]"]
  node_registry["Box registry<br/>[MP4.java]"]
end

subgraph group_decode["Box Decoding"]
  node_boxmodel["Box model<br/>[Box.java]"]
  node_basicbox["Basic box<br/>[BasicBox.java]"]
  node_fullbox["Full box<br/>[FullBox.java]"]
  node_decoders["Box decoders"]
  node_charutil["Value conversion<br/>[CharUtil.java]"]
end

subgraph group_data["Display Data"]
  node_datafragment["Data view<br/>[DataFragment.java]"]
  node_queue["Data queue<br/>[MyHandler.java]"]
  node_datamodel["Field data<br/>[DataModel.java]"]
  node_adapter["Field adapter<br/>[DataRvAdapter.java]"]
end

node_user(("User"))
node_file["MP4 file"]

node_user -->|"selects file"| node_activity
node_activity -->|"accesses file"| node_fileutil
node_file -.->|"read source"| node_fileutil
node_activity -->|"starts parsing"| node_readinfo
node_readinfo -->|"delegates to"| node_scanner
node_scanner -->|"reflectively invokes"| node_decoders
node_scanner -->|"creates boxes"| node_boxmodel
node_scanner -->|"queues fields"| node_queue
node_queue -->|"stores items"| node_datamodel
node_activity -->|"uses registry"| node_registry
node_registry -->|"maps box types"| node_decoders
node_decoders -->|"extends or reads"| node_boxmodel
node_decoders -->|"uses base"| node_basicbox
node_decoders -->|"uses base"| node_fullbox
node_basicbox -->|"converts values"| node_charutil
node_scanner -->|"decodes fields"| node_charutil
node_activity -->|"uses adapter"| node_tree
node_tree -->|"renders boxes"| node_boxmodel
node_tree -->|"queries types"| node_registry
node_activity -->|"updates description"| node_describe
node_activity -->|"shows data view"| node_datafragment
node_datafragment -->|"drains items"| node_queue
node_datafragment -->|"displays fields"| node_adapter
node_adapter -->|"renders fields"| node_datamodel

click node_activity "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/MainActivity.java"
click node_fileutil "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/AndroidFileUtil.java"
click node_readinfo "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/ReadInfo.java"
click node_scanner "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java"
click node_registry "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/MP4.java"
click node_boxmodel "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/Box.java"
click node_basicbox "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/BasicBox.java"
click node_fullbox "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/FullBox.java"
click node_decoders "https://github.com/yetote/mp4info/tree/master/app/src/main/java/com/yetote/mp4info/bean"
click node_charutil "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/CharUtil.java"
click node_tree "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java"
click node_describe "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/fragment/DescribeFragment.java"
click node_datafragment "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/fragment/DataFragment.java"
click node_queue "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/MyHandler.java"
click node_datamodel "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/DataModel.java"
click node_adapter "https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/adapter/DataRvAdapter.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_activity,node_tree,node_describe,node_user toneBlue
class node_fileutil,node_readinfo,node_scanner,node_registry toneAmber
class node_boxmodel,node_basicbox,node_fullbox,node_decoders,node_charutil toneMint
class node_datafragment,node_queue,node_datamodel,node_adapter toneRose
class node_file toneIndigo
```

## Components

### Android UI

- [Main activity](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/MainActivity.java): `app/src/main/java/com/yetote/mp4info/MainActivity.java`
- [Box tree adapter](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java): `app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java`
- [Description view](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/fragment/DescribeFragment.java): `app/src/main/java/com/yetote/mp4info/fragment/DescribeFragment.java`

### MP4 Parsing

- [File access](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/AndroidFileUtil.java): `app/src/main/java/com/yetote/mp4info/util/AndroidFileUtil.java`
- [Read interface](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/ReadInfo.java): `app/src/main/java/com/yetote/mp4info/util/ReadInfo.java`
- [NIO scanner](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java): `app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java`
- [Box registry](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/MP4.java): `app/src/main/java/com/yetote/mp4info/util/MP4.java`

### Box Decoding

- [Box model](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/Box.java): `app/src/main/java/com/yetote/mp4info/model/Box.java`
- [Basic box](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/BasicBox.java): `app/src/main/java/com/yetote/mp4info/model/BasicBox.java`
- [Full box](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/FullBox.java): `app/src/main/java/com/yetote/mp4info/model/FullBox.java`
- [Box decoders](https://github.com/yetote/mp4info/tree/master/app/src/main/java/com/yetote/mp4info/bean): `app/src/main/java/com/yetote/mp4info/bean`
- [Value conversion](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/CharUtil.java): `app/src/main/java/com/yetote/mp4info/util/CharUtil.java`

### Display Data

- [Data view](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/fragment/DataFragment.java): `app/src/main/java/com/yetote/mp4info/fragment/DataFragment.java`
- [Data queue](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/util/MyHandler.java): `app/src/main/java/com/yetote/mp4info/util/MyHandler.java`
- [Field data](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/model/DataModel.java): `app/src/main/java/com/yetote/mp4info/model/DataModel.java`
- [Field adapter](https://github.com/yetote/mp4info/blob/master/app/src/main/java/com/yetote/mp4info/adapter/DataRvAdapter.java): `app/src/main/java/com/yetote/mp4info/adapter/DataRvAdapter.java`

### Other components

- **User**
- **MP4 file**

## Connections

- User → Main activity: selects file (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- Main activity → File access: accesses file (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- MP4 file → File access: read source
- Main activity → Read interface: starts parsing (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- Read interface → NIO scanner: delegates to (evidence: `app/src/main/java/com/yetote/mp4info/util/ReadInfo.java`)
- NIO scanner → Box decoders: reflectively invokes (evidence: `app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java`)
- NIO scanner → Box model: creates boxes (evidence: `app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java`)
- NIO scanner → Data queue: queues fields (evidence: `app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java`)
- Data queue → Field data: stores items (evidence: `app/src/main/java/com/yetote/mp4info/util/MyHandler.java`)
- Main activity → Box registry: uses registry (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- Box registry → Box decoders: maps box types (evidence: `app/src/main/java/com/yetote/mp4info/util/MP4.java`)
- Box decoders → Box model: extends or reads (evidence: `app/src/main/java/com/yetote/mp4info/bean/Sgpd.java`)
- Box decoders → Basic box: uses base (evidence: `app/src/main/java/com/yetote/mp4info/bean/Avcc.java`)
- Box decoders → Full box: uses base (evidence: `app/src/main/java/com/yetote/mp4info/bean/Sgpd.java`)
- Basic box → Value conversion: converts values (evidence: `app/src/main/java/com/yetote/mp4info/model/BasicBox.java`)
- NIO scanner → Value conversion: decodes fields (evidence: `app/src/main/java/com/yetote/mp4info/util/NIOReadInfo.java`)
- Main activity → Box tree adapter: uses adapter (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- Box tree adapter → Box model: renders boxes (evidence: `app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java`)
- Box tree adapter → Box registry: queries types (evidence: `app/src/main/java/com/yetote/mp4info/adapter/TreeNodeAdapter.java`)
- Main activity → Description view: updates description (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- Main activity → Data view: shows data view (evidence: `app/src/main/java/com/yetote/mp4info/MainActivity.java`)
- Data view → Data queue: drains items (evidence: `app/src/main/java/com/yetote/mp4info/fragment/DataFragment.java`)
- Data view → Field adapter: displays fields (evidence: `app/src/main/java/com/yetote/mp4info/fragment/DataFragment.java`)
- Field adapter → Field data: renders fields (evidence: `app/src/main/java/com/yetote/mp4info/adapter/DataRvAdapter.java`)
