Update pssh-box.py to remove external dependencies
With the update, the script needs to be launched from out/{Debug,Release} directory. Also updated docs to make it clear how to use the tool. Fixes #538. Change-Id: I37b71afc33e3b73ff5232e43d79c52ffa5859d57
This commit is contained in:
parent
22af5533b1
commit
72c4797a59
|
@ -151,6 +151,20 @@
|
||||||
}],
|
}],
|
||||||
'dependencies': ['packager'],
|
'dependencies': ['packager'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'target_name': 'pssh_box_py',
|
||||||
|
'type': 'none',
|
||||||
|
'copies': [{
|
||||||
|
'destination': '<(PRODUCT_DIR)',
|
||||||
|
'files': [
|
||||||
|
'tools/pssh/pssh-box.py',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
'dependencies': [
|
||||||
|
'media/base/media_base.gyp:widevine_pssh_data_proto',
|
||||||
|
'third_party/protobuf/protobuf.gyp:py_proto',
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'target_name': 'status',
|
'target_name': 'status',
|
||||||
'type': '<(component)',
|
'type': '<(component)',
|
||||||
|
|
|
@ -464,13 +464,6 @@
|
||||||
'python/google/protobuf/symbol_database.py',
|
'python/google/protobuf/symbol_database.py',
|
||||||
'python/google/protobuf/text_encoding.py',
|
'python/google/protobuf/text_encoding.py',
|
||||||
'python/google/protobuf/text_format.py',
|
'python/google/protobuf/text_format.py',
|
||||||
|
|
||||||
# TODO(ncarter): protoc's python generator treats
|
|
||||||
# descriptor.proto specially, but only when the input path is
|
|
||||||
# exactly "google/protobuf/descriptor.proto". I'm not sure how
|
|
||||||
# to execute a rule from a different directory. For now, use a
|
|
||||||
# manually-generated copy of descriptor_pb2.py.
|
|
||||||
'python/google/protobuf/descriptor_pb2.py',
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -491,39 +484,33 @@
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
# # We can't generate a proper descriptor_pb2.py -- see earlier comment.
|
# Generate descriptor_pb2.py.
|
||||||
# 'rules': [
|
'rules': [
|
||||||
# {
|
{
|
||||||
# 'rule_name': 'genproto',
|
'rule_name': 'genproto',
|
||||||
# 'extension': 'proto',
|
'extension': 'proto',
|
||||||
# 'inputs': [
|
'inputs': [
|
||||||
# '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
|
'<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
|
||||||
# ],
|
],
|
||||||
# 'variables': {
|
'outputs': [
|
||||||
# # The protoc compiler requires a proto_path argument with the
|
'<(PRODUCT_DIR)/pyproto/google/protobuf/<(RULE_INPUT_ROOT)_pb2.py',
|
||||||
# # directory containing the .proto file.
|
],
|
||||||
# 'rule_input_relpath': 'src/google/protobuf',
|
'action': [
|
||||||
# },
|
'<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
|
||||||
# 'outputs': [
|
'-Isrc',
|
||||||
# '<(PRODUCT_DIR)/pyproto/google/protobuf/<(RULE_INPUT_ROOT)_pb2.py',
|
'--python_out=<(PRODUCT_DIR)/pyproto',
|
||||||
# ],
|
'src/google/protobuf/descriptor.proto',
|
||||||
# 'action': [
|
],
|
||||||
# '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)protoc<(EXECUTABLE_SUFFIX)',
|
'message': 'Generating Python code from <(RULE_INPUT_PATH)',
|
||||||
# '-I./src',
|
},
|
||||||
# '-I.',
|
],
|
||||||
# '--python_out=<(PRODUCT_DIR)/pyproto/google/protobuf',
|
'dependencies': [
|
||||||
# 'google/protobuf/descriptor.proto',
|
'protoc#host',
|
||||||
# ],
|
],
|
||||||
# 'message': 'Generating Python code from <(RULE_INPUT_PATH)',
|
'sources': [
|
||||||
# },
|
'src/google/protobuf/descriptor.proto',
|
||||||
# ],
|
],
|
||||||
# 'dependencies': [
|
},
|
||||||
# 'protoc#host',
|
|
||||||
# ],
|
|
||||||
# 'sources': [
|
|
||||||
# 'src/google/protobuf/descriptor.proto',
|
|
||||||
# ],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
}, { # use_system_protobuf==1
|
}, { # use_system_protobuf==1
|
||||||
'targets': [
|
'targets': [
|
||||||
|
|
|
@ -1,29 +1,86 @@
|
||||||
pssh-box - Utility to generate and print PSSH boxes
|
pssh-box - Utility to parse and generate PSSH boxes
|
||||||
===================================================
|
===================================================
|
||||||
|
|
||||||
## Installation
|
## Prerequisite
|
||||||
|
|
||||||
To use this script you must first install the Python ProtoBuf library. If you
|
- Python 2.6 or newer.
|
||||||
have it installed already, you can just use the script directly. These
|
|
||||||
instructions describe how to compile the ProtoBuf library so this script can
|
|
||||||
run. This will not install ProtoBuf globally; it will only compile it.
|
|
||||||
|
|
||||||
1) You need Python 2.6 or newer.
|
## Build the utility using Shaka Packager build setup
|
||||||
|
|
||||||
2) Install `setuptools`. This is installed by default when you
|
The utility needs to be built before being used, i.e. do not use the script in
|
||||||
install `pip`. If you don't have it, when you run `setup.py` it will install
|
`packager/tools/pssh/pssh_box.py` directly.
|
||||||
it locally. If you want to install manually, see:
|
|
||||||
|
|
||||||
```
|
If you have not set up the build environment for Shaka Packager, see
|
||||||
https://packaging.python.org/en/latest/installing.html#setup-for-installing-packages
|
https://github.com/google/shaka-packager/blob/master/docs/source/build_instructions.md.
|
||||||
```
|
|
||||||
|
|
||||||
3) Build the packager, which will build `protoc` in `out/{Debug,Release}`.
|
With the build environment set up, use `ninja` to build the utility:
|
||||||
|
|
||||||
4) Run `setup.py`. You will need to have `protoc` in PATH, which was build in
|
|
||||||
the previous step:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd packager/third_party/protobuf/python
|
$ ninja -C out/Release pssh_box_py
|
||||||
PATH=../../../../out/{Debug,Release}/:"$PATH" python setup.py build
|
```
|
||||||
|
|
||||||
|
Then you can use the built utility in `out/Release/pssh_box.py`. You can add
|
||||||
|
`out/Release` to your `PATH` so you can run it from anywhere.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
All examples below assume that that `pssh-box.py` is in the `PATH` variable of
|
||||||
|
the executing shell.
|
||||||
|
|
||||||
|
### PSSH box generation
|
||||||
|
|
||||||
|
The utility can be used to generate one or more PSSH boxes.
|
||||||
|
|
||||||
|
An example to generate a Widevine PSSH with content-id 1234:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py --widevine-system-id --content-id 1234
|
||||||
|
```
|
||||||
|
|
||||||
|
It can be also be used to generate PSSH box from PSSH data (base64), e.g.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py --widevine-system-id --pssh-data AAAABCICEjQ=
|
||||||
|
```
|
||||||
|
|
||||||
|
The output can be in base64 form (`--base64`), in hex form (`--hex`) or in human
|
||||||
|
readable form (`--human`). Human readable form is the default.
|
||||||
|
|
||||||
|
An example to generate a Widevine PSSH with content-id 1234 in hex:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py --widevine-system-id --content-id 1234 --hex
|
||||||
|
```
|
||||||
|
|
||||||
|
Multiple boxes can be generated by separating boxes with `--`.
|
||||||
|
|
||||||
|
An example to generate concatenated PSSHs with a Widevine PSSH with content-id
|
||||||
|
1234 and a common PSSH with key-id 31323334353637383930313233343536 (hex form).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py \
|
||||||
|
--widevine-system-id --content-id 1234 -- \
|
||||||
|
--common-system-id --key-id 31323334353637383930313233343536
|
||||||
|
```
|
||||||
|
|
||||||
|
### PSSH box parsing
|
||||||
|
|
||||||
|
The utility can be used to parse a single PSSH box or multiple concatenated PSSH
|
||||||
|
boxes. The input can be in hex or in base64.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py --from-hex \
|
||||||
|
000000247073736800000000EDEF8BA979D64ACEA3C827DCD51D21ED0000000422021234
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py --from-base64 AAAAJHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAAQiAhI0
|
||||||
|
```
|
||||||
|
|
||||||
|
### More options
|
||||||
|
|
||||||
|
Run the utility with no arguments to see the full list of options.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pssh-box.py
|
||||||
```
|
```
|
||||||
|
|
|
@ -14,24 +14,17 @@ import os
|
||||||
import struct
|
import struct
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Append the local protobuf location. Use a path relative to the tools/pssh
|
_script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
# folder where this file should be found. This allows the file to be executed
|
_proto_path = os.path.join(_script_dir, 'pyproto')
|
||||||
# from any directory.
|
_widevine_proto_path = os.path.join(_proto_path, 'packager/media/base')
|
||||||
_pssh_dir = os.path.dirname(os.path.realpath(__file__))
|
|
||||||
sys.path.insert(0, os.path.join(_pssh_dir, '../../third_party/protobuf/python'))
|
|
||||||
# Import the widevine protobuf. Use either Release or Debug.
|
|
||||||
_proto_path_format = os.path.join(
|
|
||||||
_pssh_dir, '../../../out/%s/pyproto/packager/media/base')
|
|
||||||
if os.path.isdir(_proto_path_format % 'Release'):
|
|
||||||
sys.path.insert(0, _proto_path_format % 'Release')
|
|
||||||
else:
|
|
||||||
sys.path.insert(0, _proto_path_format % 'Debug')
|
|
||||||
try:
|
|
||||||
import widevine_pssh_data_pb2 # pylint: disable=g-import-not-at-top
|
|
||||||
except ImportError:
|
|
||||||
print >> sys.stderr, 'Cannot find proto file, make sure to build first'
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
assert os.path.exists(_proto_path), (
|
||||||
|
'Please run from output directory, e.g. out/Debug/pssh-box.py')
|
||||||
|
|
||||||
|
sys.path.insert(0, _proto_path)
|
||||||
|
sys.path.insert(0, _widevine_proto_path)
|
||||||
|
|
||||||
|
import widevine_pssh_data_pb2 # pylint: disable=g-import-not-at-top
|
||||||
|
|
||||||
COMMON_SYSTEM_ID = base64.b16decode('1077EFECC0B24D02ACE33C1E52E2FB4B')
|
COMMON_SYSTEM_ID = base64.b16decode('1077EFECC0B24D02ACE33C1E52E2FB4B')
|
||||||
WIDEVINE_SYSTEM_ID = base64.b16decode('EDEF8BA979D64ACEA3C827DCD51D21ED')
|
WIDEVINE_SYSTEM_ID = base64.b16decode('EDEF8BA979D64ACEA3C827DCD51D21ED')
|
||||||
|
|
Loading…
Reference in New Issue