[-]
[+]
|
Changed |
_service:tar_git:gmp-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:gmp-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,7 +2,7 @@
<service name="tar_git">
<param name="url">https://github.com/sailfishos/gmp-droid.git</param>
<param name="branch">master</param>
- <param name="revision">0.1.2</param>
+ <param name="revision">0.1.11</param>
<param name="token"/>
<param name="debian">N</param>
<param name="dumb">N</param>
|
[-]
[+]
|
Changed |
_service:tar_git:gmp-droid-0.1.11.tar.gz/gmp-droid-conv.cpp
^
|
@@ -32,7 +32,7 @@
GMPErr Convert (GMPVideoHost * host, DroidMediaData * in,
GMPVideoi420Frame * out)
{
- int32_t size = m_width * m_height;
+ int32_t size = m_stride * m_slice_height;
uint8_t *buf = (uint8_t *) malloc (size * 3 / 2);
droid_media_convert_to_i420 (m_convert, in, buf);
out->CreateFrame (size, buf,
@@ -154,7 +154,7 @@
void SetFormat (DroidMediaRect * rect, int32_t width, int32_t height)
{
this->DroidColourConvert::SetFormat (rect, width, height);
- m_stride = ALIGN_SIZE (width, 4);
+ m_slice_height = ALIGN_SIZE (m_slice_height, 4);
}
};
@@ -229,7 +229,6 @@
}
}
- //TODO: DONT_USE_CODEC_SPECIFIED_HEIGHT/WIDTH quirks (if a device needs this)
converter->SetFormat (rect, md->width, md->height);
return converter;
}
|
[-]
[+]
|
Changed |
_service:tar_git:gmp-droid-0.1.11.tar.gz/gmp-droid.cpp
^
|
@@ -66,6 +66,9 @@
err = g_platform_api->createmutex (&m_stop_lock);
if (GMP_FAILED (err))
Error (err);
+ err = g_platform_api->createmutex (&m_drain_lock);
+ if (GMP_FAILED (err))
+ Error (err);
}
virtual ~DroidVideoDecoder ()
@@ -73,6 +76,7 @@
// Destroy the Mutex
m_codec_lock->Destroy ();
m_stop_lock->Destroy ();
+ m_drain_lock->Destroy ();
}
// GMPVideoDecoder methods
@@ -188,20 +192,25 @@
return;
}
- // Check that we won't run out of space in the buffer
- if (offset + len + 4 > inputFrame->Size ()) {
- LOG (ERROR,
- "Not enough space left for " << len << " bytes of NAL data");
- Error (GMPDecodeErr);
- return;
- }
- // Write NAL start code over the lenth
- static const uint8_t code[] = { 0x00, 0x00, 0x00, 0x01 };
- const uint8_t *start_code = code + (4 - start_code_len);
- memcpy (inputFrame->Buffer () + offset, start_code, start_code_len);
- offset += start_code_len + len;
- LOG (DEBUG, "Parsed nal unit of size " << len);
+ if (len == 1) {
+ // Start code already processed
+ LOG (DEBUG, "NAL start code found. Skipping");
+ break;
+ } else if (offset + len + 4 > inputFrame->Size ()) {
+ // Make sure that we won't run out of space in the buffer
+ LOG (DEBUG,
+ "NAL length more than buffer size: " << len << " bytes");
+ break;
+ } else {
+ // Write NAL start code over the length
+ static const uint8_t code[] = { 0x00, 0x00, 0x00, 0x01 };
+ const uint8_t *start_code = code + (4 - start_code_len);
+ memcpy (inputFrame->Buffer () + offset, start_code, start_code_len);
+ offset += start_code_len + len;
+
+ LOG (DEBUG, "Parsed nal unit of size " << len);
+ }
}
}
@@ -214,7 +223,7 @@
cdata.ts = inputFrame->TimeStamp ();
// Android doesn't pass duration through the codec - we'll have to keep it
- m_dur.emplace (cdata.ts, inputFrame->Duration ());
+ m_dur[cdata.ts] = inputFrame->Duration ();
cdata.sync = inputFrame->FrameType () == kGMPKeyFrame;
inputFrame->Destroy ();
@@ -235,24 +244,44 @@
void SubmitBufferThread (DroidMediaCodecData cdata,
DroidMediaBufferCallbacks cb)
{
-
+ m_drain_lock->Acquire ();
if (m_draining || (!m_codec && !CreateCodec ())) {
+ LOG (ERROR, "Buffer submitted while draining");
cb.unref (cb.data);
+ m_drain_lock->Release ();
return;
}
+ m_drain_lock->Release ();
+
+ // This blocks when the input Source is full
droid_media_codec_queue (m_codec, &cdata, &cb);
+ m_drain_lock->Acquire ();
if (!m_draining && m_callback && g_platform_api) {
g_platform_api->runonmainthread (WrapTask (m_callback,
&GMPVideoDecoderCallback::InputDataExhausted));
}
+ m_drain_lock->Release ();
}
virtual void Reset ()
{
- ResetCodec ();
- m_callback->ResetComplete ();
+ m_stop_lock->Acquire ();
+ if (m_resetting) {
+ m_stop_lock->Release ();
+ return;
+ }
+ m_resetting = true;
+ m_stop_lock->Release ();
+ if (m_codec) {
+ ResetCodec ();
+ }
+ m_drain_lock->Acquire ();
+ m_draining = false;
+ m_drain_lock->Release ();
+ m_resetting = false;
+ m_callback->ResetComplete ();
}
virtual void Drain ()
@@ -261,14 +290,21 @@
droid_media_codec_drain (m_codec);
}
- m_draining = true;
- //TODO: This never happens because the codec never really drains
- if (!m_codec || m_dur.size () == 0)
+ //TODO: This never happens because the codec never really drains, except for EOS
+ m_drain_lock->Acquire ();
+ if (!m_codec || m_dur.size () == 0) {
m_callback->DrainComplete ();
+ m_draining = false;
+ } else {
+ m_draining = true;
+ }
+ m_drain_lock->Release ();
}
virtual void DecodingComplete ()
{
+ m_callback = nullptr;
+ m_host = nullptr;
ResetCodec ();
}
@@ -298,10 +334,10 @@
cb.data_available = DataAvailable;
droid_media_codec_set_data_callbacks (m_codec, &cb, this);
}
-
// Reset state
+ m_drain_lock->Acquire ();
m_draining = false;
- m_dur.clear ();
+ m_drain_lock->Release ();
if (!droid_media_codec_start (m_codec)) {
droid_media_codec_destroy (m_codec);
@@ -323,7 +359,7 @@
memset (&md, 0x0, sizeof (md));
memset (&rect, 0x0, sizeof (rect));
droid_media_codec_get_output_info (m_codec, &md, &rect);
- LOG (DEBUG,
+ LOG (INFO,
"ConfigureOutput: Configuring converter for stride:" << md.width
<< " slice-height: " << md.height << " top: " << rect.top
<< " left:" << rect.left << " width: " << rect.right - rect.left
@@ -341,9 +377,6 @@
void ResetCodec ()
{
- m_stop_lock->Acquire ();
- m_resetting = true;
- m_stop_lock->Release ();
if (m_codec) {
LOG (DEBUG, "Codec draining");
droid_media_codec_drain (m_codec);
@@ -368,7 +401,6 @@
m_dur.clear ();
RequestNewConverter ();
m_codec_lock->Release ();
- m_resetting = false;
}
void ProcessFrameLock (DroidMediaCodecData * decoded)
@@ -398,6 +430,11 @@
m_dropConverter = false;
}
+ if (m_resetting || !m_callback || !m_host) {
+ LOG(INFO, "Discarding decoded frame received while resetting");
+ return;
+ }
+
if (!m_conv) {
ConfigureOutput (data);
}
@@ -426,12 +463,12 @@
return;
}
// Set timestamp
- uint64_t ts = data->ts / 1000;
+ int64_t ts = data->ts / 1000;
frame->SetTimestamp (ts);
// Look up duration in our cache
|
[-]
[+]
|
Changed |
_service:tar_git:gmp-droid-0.1.11.tar.gz/meson.build
^
|
@@ -13,7 +13,7 @@
droidmedia_h = include_directories('/usr/include/droidmedia')
hybris_dep = cc.find_library('hybris-common', required: true)
-gmpdroid_install_dir = '/'.join([ get_option('libdir'), 'xulrunner-qt5-'+get_option('gecko_ver'), meson.project_name(), meson.project_version()])
+gmpdroid_install_dir = '/'.join([ get_option('libdir'), meson.project_name(), meson.project_version()])
gmp_source = [
'gmp-droid.cpp',
|
[-]
[+]
|
Deleted |
_service:tar_git:gmp-droid-0.1.2.tar.gz/meson_options.txt
^
|
@@ -1 +0,0 @@
-option('gecko_ver', type : 'string', description : 'Gecko version')
|