Skip to content

Commit 0cc6a7b

Browse files
authored
1080 codec-specific encoder params (#1082)
* implemented codec-specific encoder params * updated docs
1 parent c1860fc commit 0cc6a7b

File tree

7 files changed

+56
-12
lines changed

7 files changed

+56
-12
lines changed

benchmarks/benchmark.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
draw_rect,
1818
nvds_to_gpu_mat,
1919
)
20-
from savant.deepstream.utils.surface import get_nvds_buf_surface
2120
from savant.deepstream.utils.iterator import nvds_frame_meta_iterator
21+
from savant.deepstream.utils.surface import get_nvds_buf_surface
2222

2323
sys.path.append('../../')
2424

docs/source/gh_script.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
"""Downloads and unpacks documentation for all published releases.
33
Usage: gh_script.py GH_OWNER/GH_REPO GH_TOKEN DST_PATH
44
"""
5-
import sys
6-
from urllib.error import HTTPError
7-
from urllib.request import Request, urlopen
8-
from pathlib import Path
95
import json
106
import shutil
7+
import sys
118
import tarfile
12-
import jinja2
9+
from pathlib import Path
10+
from urllib.error import HTTPError
11+
from urllib.request import Request, urlopen
1312

13+
import jinja2
1414

1515
ASSET_NAME = 'docs.tar'
1616

docs/source/savant_101/12_video_processing.rst

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ You can choose hardware or software encoder by setting ``encoder`` parameter to
255255
256256
When ``encoder`` parameter is specified and the framework doesn't find a suitable encoder, it will end with an error. When ``encoder`` parameter is omitted, the framework will try to use hardware encoder. When it fails, it will fall back to software encoder.
257257

258-
Every codec has its own configuration parameters related to a corresponding GStreamer plugin. Those parameters are defined in ``output_frame.encoder_params``:
258+
Every codec has its own configuration parameters related to a corresponding GStreamer plugin. Those parameters are defined in ``output_frame.encoder_params`` or ``output_frame.{codec_name}_encoder_params`` if the pipeline can be launched with various codecs:
259259

260260
.. code-block:: yaml
261261
@@ -267,10 +267,32 @@ Every codec has its own configuration parameters related to a corresponding GStr
267267
iframeinterval: 10
268268
profile: High
269269
270+
or
271+
272+
.. code-block:: yaml
273+
274+
parameters:
275+
output_frame:
276+
codec: ${oc.env:CODEC, 'h264'}
277+
h264_encoder_params:
278+
profile: Baseline
279+
bitrate: 8000000
280+
hevc_encoder_params:
281+
profile: Main
282+
bitrate: 8000000
283+
jpeg_encoder_params:
284+
quality: 99
285+
286+
287+
.. tip::
288+
289+
The pipeline first tries to apply ``output_frame.{codec_name}_encoder_params`` and later ``output_frame.encoder_params`` if the specific configuration is absent.
290+
270291

271292
.. tip::
272293
Find out more on the `software H264 encoder <https://blog.savant-ai.io/savant-explained-software-video-encoder-543ed147f9f?source=friends_link&sk=155e038056bbbca6d43793297e4afdda>`_ on Medium.
273294

295+
274296
Encoder Properties
275297
------------------
276298

samples/license_plate_recognition/module.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@ name: license_plate_recognition
33
parameters:
44
output_frame:
55
codec: ${oc.env:CODEC, 'h264'}
6-
encoder_params:
6+
h264_encoder_params:
7+
profile: Baseline
78
bitrate: 8000000
9+
hevc_encoder_params:
10+
profile: Main
11+
bitrate: 8000000
12+
jpeg_encoder_params:
13+
quality: 99
814
frame:
915
width: ${oc.decode:${oc.env:FRAME_WIDTH, 1920}}
1016
height: ${oc.decode:${oc.env:FRAME_HEIGHT, 1080}}

samples/uridecodebin/src/egress_frame_filter.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
from savant.base.frame_filter import BaseFrameFilter
21
from savant_rs.primitives import VideoFrame
32

3+
from savant.base.frame_filter import BaseFrameFilter
4+
5+
46
class EgressFilter(BaseFrameFilter):
57
"""Default ingress filter, filters out frames with no video data."""
68

7-
def __init__(self, source_id: str,*args, **kwargs):
9+
def __init__(self, source_id: str, *args, **kwargs):
810
super().__init__(*args, **kwargs)
911
self.logger.info(f'Egress filter initialized for source {source_id}')
1012
self.source_id = source_id

savant/deepstream/encoding.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ def check_encoder_is_available(
5252
parser_props = {'config-interval': -1}
5353
else:
5454
parser_props = {}
55+
56+
# check if {codec}_encoder_params are available
57+
encoder_params_key_name = f'{codec.value.name.lower()}_encoder_params'
58+
encoder_params = codec_params.get(encoder_params_key_name, {})
59+
if not encoder_params:
60+
encoder_params = codec_params.get('encoder_params', {})
61+
5562
elements = [
5663
PipelineElement(
5764
'videotestsrc',
@@ -64,7 +71,7 @@ def check_encoder_is_available(
6471
PipelineElement('nvvideoconvert'),
6572
PipelineElement(
6673
encoder,
67-
properties=codec_params.get('encoder_params', {}),
74+
properties=encoder_params,
6875
),
6976
PipelineElement(
7077
codec.value.parser,

savant/deepstream/source_output.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,14 @@ def __init__(
421421
)
422422
self._output_frame = output_frame
423423
self._encoder = self._codec.encoder(output_frame.get('encoder'))
424-
self._params = output_frame.get('encoder_params') or {}
424+
425+
# check if {codec}_encoder_params are available
426+
encoder_params_key_name = f'{self._codec.name.lower()}_encoder_params'
427+
encoder_params = output_frame.get(encoder_params_key_name, {})
428+
if not encoder_params:
429+
encoder_params = output_frame.get('encoder_params', {})
430+
431+
self._params = encoder_params
425432

426433
@property
427434
def encoder(self) -> str:

0 commit comments

Comments
 (0)