transcoder: initial version of pause/resume

- Add pause/resume in TranscoderWrapper, save paused state on pause
  and use it to create new transcoder on resume.

Misc fixes:

- TranscoderWrapper::stop should only cancel transcoder if the stop
  is for the currently running job. Scheduler could call stop to
  cancel a job any time.
- Don't hold TranscoderWrapper lock when running event runnable. If
  the runnable calls back into scheduler, and scheduler may call
  transcoder again and deadlock.
- Don't report abort as error if the transcoder is cancelled explicitly.
- Push decoder/encoder start as msgs, so that they could be skipped too
  if the job is cancelled shortly after starts.

Tests:
Add tests for cancel/pause/resume with real transcoder.

bug: 154734285
bug: 154733948
test: unit testing
Change-Id: I2b7d3da69df53b92ab351db455310799ba0e0e8f
diff --git a/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h b/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h
index 4259f54..2f4e74b 100644
--- a/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h
+++ b/services/mediatranscoding/tests/MediaTranscodingServiceTestHelper.h
@@ -66,6 +66,8 @@
 constexpr const char* kClientPackageB = "com.android.tests.transcoding.testapp.B";
 constexpr const char* kClientPackageC = "com.android.tests.transcoding.testapp.C";
 
+constexpr const char* kTestActivityName = "/com.android.tests.transcoding.MainActivity";
+
 static status_t getUidForPackage(String16 packageName, userid_t userId, /*inout*/ uid_t& uid) {
     PermissionController pc;
     uid = pc.getPackageUid(packageName, 0);
@@ -167,20 +169,28 @@
     }
 
     // Push 1 event to back.
-    void append(const Event& event) {
+    void append(const Event& event,
+                const TranscodingErrorCode err = TranscodingErrorCode::kNoError) {
         ALOGD("%s", toString(event).c_str());
 
         std::unique_lock lock(mLock);
 
         mEventQueue.push_back(event);
+        mLastErr = err;
         mCondition.notify_one();
     }
 
+    TranscodingErrorCode getLastError() {
+        std::unique_lock lock(mLock);
+        return mLastErr;
+    }
+
 private:
     std::mutex mLock;
     std::condition_variable mCondition;
     Event mPoppedEvent;
     std::list<Event> mEventQueue;
+    TranscodingErrorCode mLastErr;
 };
 
 // Operators for GTest macros.
@@ -205,8 +215,14 @@
         ALOGD("@@@ openFileDescriptor: %s", in_fileUri.c_str());
         int fd;
         if (in_mode == "w" || in_mode == "rw") {
-            // Write-only, create file if non-existent, don't overwrite existing file.
-            constexpr int kOpenFlags = O_WRONLY | O_CREAT | O_EXCL;
+            int kOpenFlags;
+            if (in_mode == "w") {
+                // Write-only, create file if non-existent, truncate existing file.
+                kOpenFlags = O_WRONLY | O_CREAT | O_TRUNC;
+            } else {
+                // Read-Write, create if non-existent, no truncate (service will truncate if needed)
+                kOpenFlags = O_RDWR | O_CREAT;
+            }
             // User R+W permission.
             constexpr int kFileMode = S_IRUSR | S_IWUSR;
             fd = open(in_fileUri.c_str(), kOpenFlags, kFileMode);
@@ -239,10 +255,9 @@
         return Status::ok();
     }
 
-    Status onTranscodingFailed(
-            int32_t in_jobId,
-            ::aidl::android::media::TranscodingErrorCode /* in_errorCode */) override {
-        append(Failed(mClientId, in_jobId));
+    Status onTranscodingFailed(int32_t in_jobId,
+                               ::aidl::android::media::TranscodingErrorCode in_errorCode) override {
+        append(Failed(mClientId, in_jobId), in_errorCode);
         return Status::ok();
     }