mirror of
https://github.com/AsahiLinux/m1n1
synced 2024-12-21 11:13:05 +00:00
80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# SPDX-License-Identifier: MIT
|
||
|
import sys, pathlib, argparse, os
|
||
|
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
|
||
|
sys.path.append("/home/eileen/asahi/avd") # git clone https://github.com/eiln/avd.git
|
||
|
# Decode via firmware-emulated AVD instruction stream
|
||
|
|
||
|
from m1n1.setup import *
|
||
|
from m1n1.utils import *
|
||
|
from m1n1.fw.avd import *
|
||
|
|
||
|
from avd_emu import AVDEmulator
|
||
|
from tools.common import ffprobe
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument('-i', '--input', type=str, required=True, help="input bitstream")
|
||
|
parser.add_argument('-d', '--dir', type=str, required=True, help="path to trace dir")
|
||
|
parser.add_argument('-f', '--firmware', type=str, default="data/fw.bin", help="path to fw")
|
||
|
parser.add_argument('-n', '--num', type=int, default=1, help="count")
|
||
|
parser.add_argument('-a', '--all', action='store_true', help="run all")
|
||
|
parser.add_argument('-x', '--stfu', action='store_true')
|
||
|
parser.add_argument('-p', '--poll', action='store_true', help="poll iommu space")
|
||
|
parser.add_argument('--save-raw', action='store_true', help="save raw yuv")
|
||
|
args = parser.parse_args()
|
||
|
mode = ffprobe(args.input)
|
||
|
|
||
|
emu = AVDEmulator(args.firmware, stfu=True)
|
||
|
emu.start()
|
||
|
paths = os.listdir(os.path.join(args.dir))
|
||
|
paths = sorted([os.path.join(args.dir, path) for path in paths if "frame" in path])
|
||
|
assert(len(paths))
|
||
|
num = len(paths) if args.all else args.num
|
||
|
num = min(len(paths), num)
|
||
|
|
||
|
if (mode == "h264"):
|
||
|
from avid.h264.decoder import AVDH264Decoder
|
||
|
dec = AVDH264Decoder()
|
||
|
elif (mode == "h265"):
|
||
|
from avid.h265.decoder import AVDH265Decoder
|
||
|
dec = AVDH265Decoder()
|
||
|
elif (mode == "vp09"):
|
||
|
from avid.vp9.decoder import AVDVP9Decoder
|
||
|
dec = AVDVP9Decoder()
|
||
|
else:
|
||
|
raise RuntimeError("unsupported codec")
|
||
|
if (args.stfu):
|
||
|
dec.stfu = True
|
||
|
dec.hal.stfu = True
|
||
|
units = dec.setup(args.input)
|
||
|
|
||
|
avd = AVDDevice(u)
|
||
|
if (mode == "h264"):
|
||
|
avd.decoder = AVDH264Dec(avd)
|
||
|
elif (mode == "h265"):
|
||
|
avd.decoder = AVDH265Dec(avd)
|
||
|
elif (mode == "vp09"):
|
||
|
avd.decoder = AVDVP9Dec(avd)
|
||
|
else:
|
||
|
raise RuntimeError("unsupported codec")
|
||
|
avd.decoder.winname = args.input
|
||
|
if (args.stfu):
|
||
|
avd.stfu = True
|
||
|
avd.boot()
|
||
|
avd.ioalloc_at(0x0, 0xf000000, stream=0)
|
||
|
if (args.poll):
|
||
|
avd.iomon.add(0x0, 0xf000000)
|
||
|
|
||
|
for i,unit in enumerate(units[:num]):
|
||
|
print(unit)
|
||
|
inst = dec.decode(unit)
|
||
|
path = paths[i]
|
||
|
print(path)
|
||
|
inst = emu.avd_cm3_cmd_decode(path)
|
||
|
avd.decoder.decode(dec.ctx, unit, inst)
|
||
|
if (args.save_raw):
|
||
|
y_data = avd.ioread(dec.ctx.y_addr, dec.ctx.luma_size, stream=0)
|
||
|
uv_data = avd.ioread(dec.ctx.uv_addr, dec.ctx.chroma_size, stream=0)
|
||
|
open("data/raw-emu/%03d.bin" % (i), "wb").write(y_data + uv_data)
|