mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-02-03 17:20:51 +03:00
media-converter: Use AV1/Opus instead of Theora/Vorbis
CW-Bug-Id: #19516
This commit is contained in:
parent
48196af449
commit
e190c26058
@ -17,7 +17,7 @@ endif
|
|||||||
|
|
||||||
all: install
|
all: install
|
||||||
|
|
||||||
build: blank.ogv blank.ptna
|
build: blank.mkv blank.ptna
|
||||||
cargo build --target $(TRIPLE64) $(CARGO_RELEASE_ARG)
|
cargo build --target $(TRIPLE64) $(CARGO_RELEASE_ARG)
|
||||||
PKG_CONFIG_ALLOW_CROSS=1 cargo build --target $(TRIPLE32) $(CARGO_RELEASE_ARG)
|
PKG_CONFIG_ALLOW_CROSS=1 cargo build --target $(TRIPLE32) $(CARGO_RELEASE_ARG)
|
||||||
|
|
||||||
@ -27,9 +27,9 @@ install: build
|
|||||||
install -d "$(DIST_GST_DIR32)"
|
install -d "$(DIST_GST_DIR32)"
|
||||||
install -m 755 target/$(TRIPLE32)/$(TARGET_BUILD_TYPE)/$(SONAME) "$(DIST_GST_DIR32)"
|
install -m 755 target/$(TRIPLE32)/$(TARGET_BUILD_TYPE)/$(SONAME) "$(DIST_GST_DIR32)"
|
||||||
|
|
||||||
blank.ogv:
|
blank.mkv:
|
||||||
#120 frames @ 30 FPS == 4 seconds
|
#120 frames @ 30 FPS == 4 seconds
|
||||||
gst-launch-1.0 videotestsrc num-buffers=120 pattern=smpte ! 'video/x-raw,format=(string)I420,width=320,height=240,framerate=(fraction)30/1' ! theoraenc ! queue ! mux. audiotestsrc num-buffers=400 freq=0 samplesperbuffer=441 ! 'audio/x-raw,rate=44100,channels=2' ! vorbisenc ! queue ! mux. oggmux name=mux ! filesink location=blank.ogv
|
gst-launch-1.0 videotestsrc num-buffers=120 pattern=smpte ! 'video/x-raw,format=(string)I420,width=320,height=240,framerate=(fraction)30/1' ! av1enc ! queue ! mux. audiotestsrc num-buffers=400 freq=0 samplesperbuffer=441 ! 'audio/x-raw,rate=48000,channels=2' ! opusenc ! queue ! mux. matroskamux name=mux ! filesink location=blank.mkv
|
||||||
|
|
||||||
make_blank_ptna: make_blank_ptna.c
|
make_blank_ptna: make_blank_ptna.c
|
||||||
gcc -Wall -O2 $(shell pkg-config --cflags opus) -o $@ $< -lm $(shell pkg-config --libs opus)
|
gcc -Wall -O2 $(shell pkg-config --cflags opus) -o $@ $< -lm $(shell pkg-config --libs opus)
|
||||||
|
BIN
media-converter/blank.mkv
Normal file
BIN
media-converter/blank.mkv
Normal file
Binary file not shown.
Binary file not shown.
@ -111,7 +111,8 @@ static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
|
|||||||
const VIDEOCONV_FOZ_TAG_VIDEODATA: u32 = 0;
|
const VIDEOCONV_FOZ_TAG_VIDEODATA: u32 = 0;
|
||||||
const VIDEOCONV_FOZ_TAG_OGVDATA: u32 = 1;
|
const VIDEOCONV_FOZ_TAG_OGVDATA: u32 = 1;
|
||||||
const VIDEOCONV_FOZ_TAG_STREAM: u32 = 2;
|
const VIDEOCONV_FOZ_TAG_STREAM: u32 = 2;
|
||||||
const VIDEOCONV_FOZ_NUM_TAGS: usize = 3;
|
const VIDEOCONV_FOZ_TAG_MKVDATA: u32 = 3;
|
||||||
|
const VIDEOCONV_FOZ_NUM_TAGS: usize = 4;
|
||||||
|
|
||||||
struct VideoConverterDumpFozdb {
|
struct VideoConverterDumpFozdb {
|
||||||
fozdb: Option<fossilize::StreamArchive>,
|
fozdb: Option<fossilize::StreamArchive>,
|
||||||
@ -165,7 +166,7 @@ impl VideoConverterDumpFozdb {
|
|||||||
let mut chunks = Vec::<(u32, u128)>::new();
|
let mut chunks = Vec::<(u32, u128)>::new();
|
||||||
|
|
||||||
for stream_id in fozdb.iter_tag(VIDEOCONV_FOZ_TAG_STREAM).cloned().collect::<Vec<u128>>() {
|
for stream_id in fozdb.iter_tag(VIDEOCONV_FOZ_TAG_STREAM).cloned().collect::<Vec<u128>>() {
|
||||||
if read_fozdb.has_entry(VIDEOCONV_FOZ_TAG_OGVDATA, stream_id) {
|
if read_fozdb.has_entry(VIDEOCONV_FOZ_TAG_MKVDATA, stream_id) {
|
||||||
if let Ok(chunks_size) = fozdb.entry_size(VIDEOCONV_FOZ_TAG_STREAM, stream_id) {
|
if let Ok(chunks_size) = fozdb.entry_size(VIDEOCONV_FOZ_TAG_STREAM, stream_id) {
|
||||||
let mut buf = vec![0u8; chunks_size].into_boxed_slice();
|
let mut buf = vec![0u8; chunks_size].into_boxed_slice();
|
||||||
if fozdb.read_entry(VIDEOCONV_FOZ_TAG_STREAM, stream_id, 0, &mut buf, fossilize::CRCCheck::WithCRC).is_ok() {
|
if fozdb.read_entry(VIDEOCONV_FOZ_TAG_STREAM, stream_id, 0, &mut buf, fossilize::CRCCheck::WithCRC).is_ok() {
|
||||||
@ -319,7 +320,7 @@ impl VideoConvState {
|
|||||||
/* true if the file is transcoded; false if not */
|
/* true if the file is transcoded; false if not */
|
||||||
fn begin_transcode(&mut self, hash: u128) -> bool {
|
fn begin_transcode(&mut self, hash: u128) -> bool {
|
||||||
if let Some(read_fozdb) = &mut self.read_fozdb {
|
if let Some(read_fozdb) = &mut self.read_fozdb {
|
||||||
if let Ok(transcoded_size) = read_fozdb.entry_size(VIDEOCONV_FOZ_TAG_OGVDATA, hash) {
|
if let Ok(transcoded_size) = read_fozdb.entry_size(VIDEOCONV_FOZ_TAG_MKVDATA, hash) {
|
||||||
self.transcode_hash = Some(hash);
|
self.transcode_hash = Some(hash);
|
||||||
self.our_duration = Some(transcoded_size as u64);
|
self.our_duration = Some(transcoded_size as u64);
|
||||||
return true;
|
return true;
|
||||||
@ -329,7 +330,7 @@ impl VideoConvState {
|
|||||||
gst_log!(CAT, "No transcoded video for {}. Substituting a blank video.", format_hash(hash));
|
gst_log!(CAT, "No transcoded video for {}. Substituting a blank video.", format_hash(hash));
|
||||||
|
|
||||||
self.transcode_hash = None;
|
self.transcode_hash = None;
|
||||||
self.our_duration = Some(include_bytes!("../blank.ogv").len() as u64);
|
self.our_duration = Some(include_bytes!("../blank.mkv").len() as u64);
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
@ -338,12 +339,12 @@ impl VideoConvState {
|
|||||||
match self.transcode_hash {
|
match self.transcode_hash {
|
||||||
Some(hash) => {
|
Some(hash) => {
|
||||||
let read_fozdb = self.read_fozdb.as_mut().unwrap();
|
let read_fozdb = self.read_fozdb.as_mut().unwrap();
|
||||||
read_fozdb.read_entry(VIDEOCONV_FOZ_TAG_OGVDATA, hash, offs as u64, out, fossilize::CRCCheck::WithoutCRC)
|
read_fozdb.read_entry(VIDEOCONV_FOZ_TAG_MKVDATA, hash, offs as u64, out, fossilize::CRCCheck::WithoutCRC)
|
||||||
.map_err(|e| gst_loggable_error!(CAT, "Error reading ogvdata: {:?}", e))
|
.map_err(|e| gst_loggable_error!(CAT, "Error reading ogvdata: {:?}", e))
|
||||||
},
|
},
|
||||||
|
|
||||||
None => {
|
None => {
|
||||||
let blank = include_bytes!("../blank.ogv");
|
let blank = include_bytes!("../blank.mkv");
|
||||||
|
|
||||||
let to_copy = std::cmp::min(blank.len() - offs, out.len());
|
let to_copy = std::cmp::min(blank.len() - offs, out.len());
|
||||||
|
|
||||||
@ -434,7 +435,7 @@ impl ObjectSubclass for VideoConv {
|
|||||||
&caps).unwrap();
|
&caps).unwrap();
|
||||||
klass.add_pad_template(sink_pad_template);
|
klass.add_pad_template(sink_pad_template);
|
||||||
|
|
||||||
let caps = gst::Caps::builder("application/ogg").build();
|
let caps = gst::Caps::builder("video/x-matroska").build();
|
||||||
let src_pad_template = gst::PadTemplate::new(
|
let src_pad_template = gst::PadTemplate::new(
|
||||||
"src",
|
"src",
|
||||||
gst::PadDirection::Src,
|
gst::PadDirection::Src,
|
||||||
@ -597,7 +598,7 @@ impl VideoConv {
|
|||||||
gst_log!(CAT, obj:pad, "Got an event {:?}", event);
|
gst_log!(CAT, obj:pad, "Got an event {:?}", event);
|
||||||
match event.view() {
|
match event.view() {
|
||||||
EventView::Caps(_) => {
|
EventView::Caps(_) => {
|
||||||
let caps = gst::Caps::builder("application/ogg").build();
|
let caps = gst::Caps::builder("video/x-matroska").build();
|
||||||
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
self.srcpad.push_event(gst::event::Caps::new(&caps))
|
||||||
}
|
}
|
||||||
_ => pad.event_default(Some(element), event)
|
_ => pad.event_default(Some(element), event)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user