aboutsummaryrefslogtreecommitdiffstats
path: root/nihav-core/src
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-02-17 15:18:13 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-02-17 15:18:13 +0100
commit285f4c726a441a610b0b6aea2269ce9eca37f17b (patch)
tree6bb945646ff7150a56abf829c68c8d67a2b1d6b8 /nihav-core/src
parent6680b4038a5e7fd2d82fb75a1423bc6e2e30f824 (diff)
downloadnihav-285f4c726a441a610b0b6aea2269ce9eca37f17b.tar.gz
core: document register module
Diffstat (limited to 'nihav-core/src')
-rw-r--r--nihav-core/src/register.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/nihav-core/src/register.rs b/nihav-core/src/register.rs
index 7c1fc1d..c54ce58 100644
--- a/nihav-core/src/register.rs
+++ b/nihav-core/src/register.rs
@@ -1,12 +1,21 @@
+//! Global registry of codec information.
+//!
+//! This module contains codec information from technical level that allows user to retrieve information about codec type and features without creating and invoking a decoder for such codec.
use std::fmt;
+/// Codec types.
#[derive(Debug,Clone,Copy,PartialEq)]
#[allow(dead_code)]
pub enum CodecType {
+ /// Video codec.
Video,
+ /// Audio codec.
Audio,
+ /// Subtitle codec.
Subtitles,
+ /// Some special codec (e.g. some event stream or separate timecodes stream).
Data,
+ /// Dummy codec.
None,
}
@@ -28,22 +37,39 @@ const CODEC_CAP_REORDER:u32 = 0x0004;
const CODEC_CAP_HYBRID:u32 = 0x0008;
const CODEC_CAP_SCALABLE:u32 = 0x0010;
+/// Codec description structure.
#[derive(Clone)]
pub struct CodecDescription {
+ /// Short codec name.
+ ///
+ /// Short codec name is used inside NihAV as the unique identifier.
pub name: &'static str,
+ /// Full codec name.
pub fname: &'static str,
+ /// Codec type.
pub ctype: CodecType,
+ /// Codec capabilities.
pub caps: u32,
}
impl CodecDescription {
+ /// Returns short codec name.
pub fn get_name(&self) -> &'static str { self.name }
+ /// Returns full codec name.
pub fn get_full_name(&self) -> &'static str { self.fname }
+ /// Returns codec type.
pub fn get_codec_type(&self) -> CodecType { self.ctype }
+ /// Reports whether the codec has only intra frames or not.
pub fn is_intraonly(&self) -> bool { (self.caps & CODEC_CAP_INTRAONLY) != 0 }
+ /// Reports whether the codec is lossless.
pub fn is_lossless(&self) -> bool { (self.caps & CODEC_CAP_LOSSLESS) != 0 }
+ /// Reports whether the codec requires frame reordering.
pub fn has_reorder(&self) -> bool { (self.caps & CODEC_CAP_REORDER) != 0 }
+ /// Reports whether the codec can be either lossless or lossy.
pub fn is_hybrid(&self) -> bool { (self.caps & CODEC_CAP_HYBRID) != 0 }
+ /// Reports whether codec supports scalability.
+ ///
+ /// Scalability means that codec can be decoded in reduced resolution by design.
pub fn is_scalable(&self) -> bool { (self.caps & CODEC_CAP_SCALABLE) != 0 }
}
@@ -108,6 +134,7 @@ macro_rules! desc {
});
}
+/// Returns codec description for the provided codec short name if it is found.
pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> {
for reg in CODEC_REGISTER {
if reg.name == name {
@@ -225,6 +252,7 @@ static WAV_CODEC_REGISTER: &'static [(u16, &str)] = &[
(0x0501, "on2avc-501"),
];
+/// Returns video codec short name for provided FOURCC (used in AVI format).
pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
if *fourcc == fcc { return Some(name); }
@@ -232,6 +260,7 @@ pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
None
}
+/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
for (twocc, name) in WAV_CODEC_REGISTER.iter() {
if *twocc == tcc { return Some(name); }