mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-05-30 01:15:33 -04:00
Adds a curated, per-encoder parameter-template library to ZoneMinder:
- Monitor edit page: a new Template row above the EncoderParameters
textarea offers per-encoder templates (Balanced / Archival / Low
Power / Low CPU). Apply merges the template's params into the
textarea, preserving user-only keys. Advisory lint flags option
keys that aren't recognised for the selected encoder. Switching
encoders offers a same-name template on the new encoder via a
native confirm.
- Options page: a new Encoder Templates tab with full CRUD —
list / edit / copy / delete — backed by a new CakePHP REST API
at /api/encoder_templates.
- Storage: a new EncoderTemplates DB table seeded with 14 shipped
defaults across libx264 / libx265 / h264_nvenc / hevc_nvenc /
h264_vaapi / hevc_vaapi. The table is mutable; ZM upgrades do not
re-seed user-edited rows.
- valid_keys (the lint allow-list) stays in PHP code as ffmpeg
vocabulary, not user data.
- Default params explicitly include pix_fmt to avoid the yuvj420p
HEVC HW-decode rejection issue we hit earlier.
No C++ change. The textarea content is parsed by the existing
av_dict_parse_string call in src/zm_videostore.cpp.
version.txt -> 1.39.6.
Specs: docs/superpowers/specs/2026-05-0{1,2}-*.md
Plans: docs/superpowers/plans/2026-05-0{1,2}-*.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
45 lines
1.3 KiB
PHP
45 lines
1.3 KiB
PHP
<?php
|
|
App::uses('AppModel', 'Model');
|
|
|
|
class EncoderTemplate extends AppModel {
|
|
public $useTable = 'EncoderTemplates';
|
|
public $primaryKey = 'Id';
|
|
public $displayField = 'Name';
|
|
public $recursive = -1;
|
|
|
|
public $validate = array(
|
|
'Encoder' => array(
|
|
'notBlank' => array(
|
|
'rule' => array('notBlank'),
|
|
'message' => 'Encoder is required',
|
|
),
|
|
),
|
|
'Name' => array(
|
|
'notBlank' => array(
|
|
'rule' => array('notBlank'),
|
|
'message' => 'Name is required',
|
|
'last' => true,
|
|
),
|
|
'unique' => array(
|
|
'rule' => array('isUniqueByEncoder'),
|
|
'message' => 'A template with that name already exists for this encoder',
|
|
),
|
|
),
|
|
);
|
|
|
|
// Custom validator: Name must be unique within the row's Encoder.
|
|
public function isUniqueByEncoder($field) {
|
|
$name = $field['Name'];
|
|
$encoder = isset($this->data[$this->alias]['Encoder']) ? $this->data[$this->alias]['Encoder'] : null;
|
|
if (!$encoder) return true; // notBlank validator on Encoder will fail separately
|
|
$conditions = array(
|
|
'EncoderTemplate.Encoder' => $encoder,
|
|
'EncoderTemplate.Name' => $name,
|
|
);
|
|
if (!empty($this->id)) {
|
|
$conditions['EncoderTemplate.Id !='] = $this->id;
|
|
}
|
|
return $this->find('count', array('conditions' => $conditions)) === 0;
|
|
}
|
|
}
|