videoplayer: add hardware-accelerated H.264 video decoding support
[nihav-player.git] / videoplayer / src / videodec.rs
index 7ebf17710fb7e2c38efacfbd18487920b74a3304..295cfc753ee64002f9288eacf7f54f256d6fbbba 100644 (file)
@@ -137,6 +137,16 @@ impl VideoDecoder {
                     return self.convert_buf(bt, ts);
                 }
             },
+            #[cfg(feature="hwaccel")]
+            DecoderType::VideoHW(ref mut vdec) => {
+                let _ = vdec.queue_pkt(pkt);
+                while let Some(frm) = vdec.get_frame() {
+                    let bt = frm.get_buffer();
+                    if let NABufferType::None = bt { continue; }
+                    let ts = frm.get_dts().unwrap_or_else(|| frm.get_pts().unwrap_or(0));
+                    return self.convert_buf(bt, ts);
+                }
+            },
             _ => panic!("not a video decoder!"),
         };
         None
@@ -188,6 +198,15 @@ impl VideoDecoder {
                     return self.convert_buf(bt, ts);
                 }
             },
+            #[cfg(feature="hwaccel")]
+            DecoderType::VideoHW(ref mut vdec) => {
+                while let Some(frm) = vdec.get_frame() {
+                    let bt = frm.get_buffer();
+                    if let NABufferType::None = bt { continue; }
+                    let ts = frm.get_dts().unwrap_or_else(|| frm.get_pts().unwrap_or(0));
+                    return self.convert_buf(bt, ts);
+                }
+            },
             _ => {},
         };
         None
@@ -210,6 +229,15 @@ impl VideoDecoder {
                     return self.convert_buf(bt, ts);
                 }
             },
+            #[cfg(feature="hwaccel")]
+            DecoderType::VideoHW(ref mut dec) => {
+                while let Some(frm) = dec.get_last_frames() {
+                    let bt = frm.get_buffer();
+                    if let NABufferType::None = bt { continue; }
+                    let ts = frm.get_dts().unwrap_or_else(|| frm.get_pts().unwrap_or(0));
+                    return self.convert_buf(bt, ts);
+                }
+            },
             _ => {},
         };
         None
@@ -224,6 +252,10 @@ impl VideoDecoder {
                 dec.flush();
                 reord.flush();
             },
+            #[cfg(feature="hwaccel")]
+            DecoderType::VideoHW(ref mut dec) => {
+                dec.flush();
+            },
             _ => {},
         };
     }