Skip to content

Commit

Permalink
v1.0.0-post2 - Initial Release
Browse files Browse the repository at this point in the history
  • Loading branch information
rlaphoenix committed Feb 28, 2020
1 parent 45a7953 commit 38be1eb
Show file tree
Hide file tree
Showing 10 changed files with 249 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/dictionaries/pragma.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/pyd2v.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

85 changes: 85 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# pyd2v

A Python Parser for DGMPGDec's D2V Project Files

`pip install pyd2v`

<p align="center">
<a href="https://python.org"><img src="https://img.shields.io/badge/python-3.6%2B-informational?style=flat-square" /></a>
<a href="https://github.com/rlaPHOENiX/pyd2v/blob/master/LICENSE"><img alt="GitHub license" src="https://img.shields.io/github/license/rlaPHOENiX/pyd2v?style=flat-square"></a>
<a href="https://www.codefactor.io/repository/github/rlaphoenix/pyd2v"><img src="https://www.codefactor.io/repository/github/rlaphoenix/pyd2v/badge" alt="CodeFactor" /></a>
<a href="https://www.codacy.com/manual/rlaPHOENiX/pyd2v?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=rlaPHOENiX/pyd2v&amp;utm_campaign=Badge_Grade"><img src="https://api.codacy.com/project/badge/Grade/574e843d9e044dcbbc2743cd8092148a"/></a>
<a href="https://github.com/rlaPHOENiX/pyd2v/issues"><img alt="GitHub issues" src="https://img.shields.io/github/issues/rlaPHOENiX/pyd2v?style=flat-square"></a>
<a href="http://makeapullrequest.com"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square"></a>
</p>

## Documentation

### Quick Example

```
# pip install pyd2v
from pyd2v import D2V
# ...
# Choose Input File
input_file = "/home/user/Desktop/video.d2v"
# Parse Input File
d2v = D2V(filename=input_file)
# Print D2V Version and Settings Options, which will be shown with the accessible variable names.
print(d2v)
# Print Input Video Files
print(d2v.videos)
# Print Frame Rate
print(d2v.settings["Frame_Rate"])
# Print first frame data
print(d2v.data[0])
```

#### Accessible Variables

A successful D2V parse will result in the following options accessible from the D2V object.

- version: D2V version, `16` is currently the latest for the original DGIndex which was last updated in 2010.
- videos: List of the video file paths that were indexed by DGIndex. It will be just a filename if "Use Full Paths" was disabled in DGIndex.
- settings: Will return various user-provided and auto-evaluated settings based on input data. More information on Settings below.
- data: Indexing data of the MPEG video stream, Each entry is of an I frame which will describe the following non-I frames up to the next I frame.
- data_type: What type of video is most previlent, e.g. `88.4% FILM`, `PAL`, `99.9% NTSC`.

#### Settings

| Auto-evaluated Settings | Possible Values | Description |
| ----------------------- | -------------------------------------- | ---------------------------------------------------------------------------------- |
| Stream_Type | 0=Elementary Stream | Defines the type of MPEG stream. |
| | 1=Program Stream | |
| | 2=Transport Stream | |
| | 3=PVA Stream | |
| Transport_Packet_Size | [188, 204] | Specifies the size in bytes of the transport packets. Used only for Stream_Type=2. |
| MPEG_Type | 1=MPEG-1, 2=MPEG-2 | Defines the type of MPEG stream. |
| Aspect_Ratio | MPEG-2: "1:1", "4:3", "16:9", "2.21:1" | Defines the Aspect Ratio of the video specified in the MPEG stream. |
| | MPEG-1: "1:1", 0.6735, ["16:9", 625], | |
| | 0.7615, 0.8055, ["16:9", 525], 0.8935, | |
| | ["4:3", 625], 0.9815, 1.0255, 1.0695, | |
| | ["4:3", 525], 1.575, 1.2015 | |
| Picture_Size | [width, height] | Defines the size of the video _after_ clipping has been applied. |
| Frame_Rate | rate [num, den] | 'rate' defines output framerate \* 1000. |

| User-specified Settings | Possible Values | Description |
| ----------------------- | ----------------------------------------- | ------------------------------------------------------------------------ |
| MPEG2_Transport_PID | {Video, Audio, RCR} | Selects the video/audio PIDs to be decoded. Used only for Stream_Type=2. |
| iDCT_Algorithm | 1=32-bit MMX | Defines the iDCT DGDecode will use to decode this video |
| | 2=32-bit SSEMMX | |
| | 3=32-bit SSE2MMX | |
| | 4=64-bit Floating Point | |
| | 5=64-bit IEEE-1180 Reference | |
| | 6=32-bit SSEMMX (Skal) | |
| | 7=32-bit Simple MMX (XviD) | |
| YUVRGB_Scale | 0=TV Scale | Defines the range DGDecode will use if RGB conversion is requested. |
| | 1=PC Scale | |
| Luminance_Filter | {Gamma, Offset} (range of +/- 256) | Defines values for DGIndex's Luminance_Filter. |
| Clipping | [ClipLeft,ClipRight,ClipTop,ClipBottom] | Defines values for Cropping lines of video. |
| Field_Operation | 0=Honor Pulldown Flags | Defines values for Field Operation. |
| | 1=Force Film | |
| | 2=Ignore Pulldown Flags | |
| Location | {StartFile,StartOffset,EndFile,EndOffset} | Defines start and end points for the video selection range. |
97 changes: 97 additions & 0 deletions pyd2v/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
class D2V:
"""
Object containing information on D2V Project Files
"""
def __init__(self, filename):
"""
Parse a d2v file
:param str filename: path to the d2v file to be parsed
:rtype: :class:`D2V`.
:raises ValueError: if parsing fails
"""
# Header
self.version = None
self.videos = None
# Settings
self.settings = None
# Data
self.data = None
self.data_type = None
with open(filename, mode="r", encoding="utf-8") as f:
# Version
self.version = f.readline().strip()
if not self.version.startswith("DGIndexProjectFile"):
raise ValueError(f"Expected Version Header, received:\n\t{self.version}")
self.version = self.version[18:] # strip "DGIndexProjectFile"
# Videos
self.videos = []
for n in range(int(f.readline().strip())):
self.videos.append(f.readline().strip())
# Headers Terminate Check
if len(f.readline().strip()) > 0:
raise ValueError("Unexpected data after reading Header's Video List.")
# Settings
self.settings = {}
int_list = ["Stream_Type", "MPEG_Type", "iDCT_Algorithm", "YUVRGB_Scale", "Field_Operation"]
while True:
line = f.readline().strip()
# Settings Terminate Check
if len(line) == 0:
break
line = line.split("=", maxsplit=2)
self.settings[line[0]] = int(line[1]) if line[0] in int_list else line[1]
if self.settings["Stream_Type"] == 2:
self.settings["MPEG2_Transport_PID"] = self.settings["MPEG2_Transport_PID"].split(",")
self.settings["MPEG2_Transport_PID"] = {
"Video": float(self.settings["MPEG2_Transport_PID"][0]),
"Audio": float(self.settings["MPEG2_Transport_PID"][1]),
"PCR": float(self.settings["MPEG2_Transport_PID"][2])
}
self.settings["Transport_Packet_Size"] = self.settings["Transport_Packet_Size"].split(",")
self.settings["Luminance_Filter"] = self.settings["Luminance_Filter"].split(",")
self.settings["Luminance_Filter"] = {
"Gamma": float(self.settings["Luminance_Filter"][0]),
"Offset": float(self.settings["Luminance_Filter"][1])
}
self.settings["Clipping"] = [int(x) for x in self.settings["Clipping"].split(",")]
if "," in self.settings["Aspect_Ratio"]:
self.settings["Aspect_Ratio"] = [
(x if ":" in x else float(x)) for x in self.settings["Aspect_Ratio"].split(",")
]
elif ":" not in self.settings["Aspect_Ratio"]:
self.settings["Aspect_Ratio"] = float(self.settings["Aspect_Ratio"])
self.settings["Picture_Size"] = [int(x) for x in self.settings["Picture_Size"].split("x")]
self.settings["Frame_Rate"] = self.settings["Frame_Rate"].split(" ")
self.settings["Frame_Rate"] = [
self.settings["Frame_Rate"][0],
[int(x) for x in self.settings["Frame_Rate"][1].strip("()").split("/")]
]
self.settings["Location"] = self.settings["Location"].split(",")
self.settings["Location"] = {
"StartFile": int(self.settings["Location"][0]),
"StartOffset": int(self.settings["Location"][1]),
"EndFile": int(self.settings["Location"][2]),
"EndOffset": int(self.settings["Location"][3])
}
# Data
self.data = []
while True:
line = f.readline().strip()
# Data Terminate Check
if len(line) == 0:
break
line = line.split(" ", maxsplit=7)
self.data.append({
"info": line[0],
"matrix": line[1],
"file": line[2],
"position": line[3],
"skip": line[4],
"vob": line[5],
"cell": line[6],
"flags": line[7].split(" ")
})
self.data_type = f.readline()[10:]

def __repr__(self):
return f"<D2V version={self.version}, data_type={self.data_type}, settings={self.settings}>"
24 changes: 24 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from setuptools import setup, find_packages

with open("README.md", "r") as f:
readme = f.read()

setup(
name="pyd2v",
version="1.0.0-post2",
author="PHOENiX",
author_email="pragma.exe@gmail.com",
description="A Python Parser for DGMPGDec's D2V Project Files",
license="MIT",
long_description=readme,
long_description_content_type="text/markdown",
url="https://github.com/rlaPHOENiX/pyd2v",
packages=find_packages(),
install_requires=[],
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires=">=3.6",
)

0 comments on commit 38be1eb

Please sign in to comment.