2019-05-01 11:09:16 +00:00
|
|
|
// Copyright (C) 2019 Guillaume Desmottes <guillaume.desmottes@collabora.com>
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
|
|
|
#![crate_type = "cdylib"]
|
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
extern crate glib;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate gstreamer as gst;
|
|
|
|
|
|
|
|
mod cdgdec;
|
2019-05-26 14:12:16 +00:00
|
|
|
mod cdgparse;
|
2019-05-26 12:48:33 +00:00
|
|
|
mod constants;
|
2019-05-01 11:09:16 +00:00
|
|
|
|
2019-06-05 05:19:27 +00:00
|
|
|
use constants::{CDG_COMMAND, CDG_MASK, CDG_PACKET_SIZE};
|
|
|
|
|
2019-07-11 07:54:22 +00:00
|
|
|
const TYPEFIND_SEARCH_WINDOW: i64 = 100_000; /* in bytes */
|
2019-06-05 05:19:27 +00:00
|
|
|
|
|
|
|
/* Return the percentage of CDG packets in the first @len bytes of @typefind */
|
|
|
|
fn cdg_packets_ratio(typefind: &mut gst::TypeFind, len: i64) -> i64 {
|
|
|
|
let mut count = 0;
|
|
|
|
let total = len / CDG_PACKET_SIZE as i64;
|
|
|
|
|
|
|
|
for offset in (0..len).step_by(CDG_PACKET_SIZE as usize) {
|
|
|
|
match typefind.peek(offset, CDG_PACKET_SIZE as u32) {
|
|
|
|
Some(data) => {
|
|
|
|
if data[0] & CDG_MASK == CDG_COMMAND {
|
|
|
|
count += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None => break,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(count * 100) / total
|
|
|
|
}
|
|
|
|
|
|
|
|
fn typefind_register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
|
|
|
use gst::{Caps, TypeFind, TypeFindProbability};
|
|
|
|
|
|
|
|
TypeFind::register(
|
|
|
|
Some(plugin),
|
|
|
|
"cdg_typefind",
|
|
|
|
gst::Rank::None,
|
|
|
|
Some("cdg"),
|
|
|
|
Some(&Caps::new_simple("video/x-cdg", &[])),
|
|
|
|
|mut typefind| {
|
|
|
|
let proba = match cdg_packets_ratio(&mut typefind, TYPEFIND_SEARCH_WINDOW) {
|
2019-06-24 18:35:30 +00:00
|
|
|
0..=5 => TypeFindProbability::None,
|
|
|
|
6..=10 => TypeFindProbability::Possible,
|
2019-06-05 05:19:27 +00:00
|
|
|
_ => TypeFindProbability::Likely,
|
|
|
|
};
|
|
|
|
|
|
|
|
if proba != gst::TypeFindProbability::None {
|
|
|
|
typefind.suggest(proba, &Caps::new_simple("video/x-cdg", &[]));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2019-05-01 11:09:16 +00:00
|
|
|
fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
2019-05-26 14:12:16 +00:00
|
|
|
cdgdec::register(plugin)?;
|
|
|
|
cdgparse::register(plugin)?;
|
2019-06-05 05:19:27 +00:00
|
|
|
typefind_register(plugin)?;
|
2019-05-26 14:12:16 +00:00
|
|
|
Ok(())
|
2019-05-01 11:09:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gst_plugin_define!(
|
2019-05-29 06:10:08 +00:00
|
|
|
cdg,
|
2019-06-03 10:53:58 +00:00
|
|
|
env!("CARGO_PKG_DESCRIPTION"),
|
2019-05-01 11:09:16 +00:00
|
|
|
plugin_init,
|
2019-06-03 10:53:58 +00:00
|
|
|
concat!(env!("CARGO_PKG_VERSION"), "-", env!("COMMIT_ID")),
|
2019-05-01 11:09:16 +00:00
|
|
|
"MIT/X11",
|
2019-06-03 10:53:58 +00:00
|
|
|
env!("CARGO_PKG_NAME"),
|
|
|
|
env!("CARGO_PKG_NAME"),
|
|
|
|
env!("CARGO_PKG_REPOSITORY"),
|
|
|
|
env!("BUILD_REL_DATE")
|
2019-05-01 11:09:16 +00:00
|
|
|
);
|