dvr: Irdeto LiveTV APK pvr playback bug fix [1/1]

PD#SWPL-20802

Problem:
  Irdeto LiveTV APK pvr playback bug fix

Solution:
2. user seek when state is pause. we need check is need replay.
    if fmt and pid are not changed,we only change read pos.
3. change sync mode at dvr_play_test.
4. add x2 1/4 1/8 speed.
5. fixed build warning.
6. clear first frame when start play.
7. add play is null.
8. del some debug info.
9. close audio when ff fb.

Verify:
Android Q + AC214

Change-Id: Id28a021a5fff1fe47534f98f710a2ebe591d6094
Signed-off-by: hualing chen <hualing.chen@amlogic.com>
diff --git a/src/dvr_utils.c b/src/dvr_utils.c
index 9c9f564..88423c3 100644
--- a/src/dvr_utils.c
+++ b/src/dvr_utils.c
@@ -8,26 +8,229 @@
 #include <dvr_types.h>
 #include <dvr_utils.h>
 
-int DVR_FileEcho(const char *name, const char *cmd)
+/****************************************************************************
+ * Macro definitions
+ ***************************************************************************/
+
+/****************************************************************************
+ * Static functions
+ ***************************************************************************/
+int (*Write_Sysfs_ptr)(const char *path, char *value);
+int (*ReadNum_Sysfs_ptr)(const char *path, char *value, int size);
+int (*Read_Sysfs_ptr)(const char *path, char *value);
+
+typedef struct dvr_rw_sysfs_cb_s
 {
-	int fd, len, ret;
+  DVR_Read_Sysfs_Cb readSysfsCb;
+  DVR_Write_Sysfs_Cb writeSysfsCb;
+}dvr_rw_sysfs_cb_t;
 
-	fd = open(name, O_WRONLY);
-	if (fd == -1)
-	{
-		DVR_DEBUG(1, "cannot open file \"%s\"", name);
-		return DVR_FAILURE;
-	}
+dvr_rw_sysfs_cb_t rwSysfsCb = {.readSysfsCb = NULL, .writeSysfsCb = NULL};
 
-	len = strlen(cmd);
-	ret = write(fd, cmd, len);
-	if (ret != len)
-	{
-		DVR_DEBUG(1, "write failed file:\"%s\" cmd:\"%s\" error:\"%s\"", name, cmd, strerror(errno));
-		close(fd);
-		return DVR_FAILURE;
-	}
-	close(fd);
+typedef struct dvr_rw_prop_cb_s
+{
+  DVR_Read_Prop_Cb readPropCb;
+  DVR_Write_Prop_Cb writePropCb;
+}dvr_rw_prop_cb_t;
 
-	return DVR_SUCCESS;
+dvr_rw_prop_cb_t rwPropCb = {.readPropCb = NULL, .writePropCb = NULL};
+
+
+/****************************************************************************
+ * API functions
+ ***************************************************************************/
+
+/**\brief regist rw sysfs cb
+ * \param[in] fun callback
+ * \return
+ *   - DVR_SUCCESS
+ *   - error
+ */
+int dvr_register_rw_sys(DVR_Read_Sysfs_Cb RCb, DVR_Write_Sysfs_Cb WCb)
+{
+
+  if (RCb == NULL || WCb == NULL) {
+    DVR_DEBUG(1, "dvr_register_rw_sys error param is NULL !!");
+    return DVR_FAILURE;
+  }
+  if (!rwSysfsCb.readSysfsCb)
+    rwSysfsCb.readSysfsCb = RCb;
+  if (!rwSysfsCb.writeSysfsCb)
+    rwSysfsCb.writeSysfsCb = WCb;
+  DVR_DEBUG(1, "dvr_register_rw_sys success !!");
+  return DVR_SUCCESS;
 }
+
+/**\brief unregist rw sys cb
+ */
+int dvr_unregister_rw_sys()
+{
+  if (rwSysfsCb.readSysfsCb)
+    rwSysfsCb.readSysfsCb = NULL;
+  if (rwSysfsCb.writeSysfsCb)
+    rwSysfsCb.writeSysfsCb = NULL;
+  return DVR_SUCCESS;
+}
+
+/**\brief regist rw prop cb
+ * \param[in] fun callback
+ * \return
+ *   - DVR_SUCCESS
+ *   - error
+ */
+
+int dvr_rgister_rw_prop(DVR_Read_Prop_Cb RCb, DVR_Write_Prop_Cb WCb)
+{
+  if (RCb == NULL || WCb == NULL) {
+    DVR_DEBUG(1, "dvr_rgister_rw_prop error param is NULL !!");
+    return DVR_FAILURE;
+  }
+
+  if (!rwPropCb.readPropCb)
+    rwPropCb.readPropCb = RCb;
+  if (!rwPropCb.writePropCb)
+    rwPropCb.writePropCb = WCb;
+
+  DVR_DEBUG(1, "dvr_rgister_rw_prop !!");
+  return DVR_SUCCESS;
+}
+
+/**\brief unregist rw prop cb */
+int dvr_unregister_rw_prop()
+{
+  if (rwPropCb.readPropCb)
+    rwPropCb.readPropCb = NULL;
+  if (rwPropCb.writePropCb)
+    rwPropCb.writePropCb = NULL;
+  return DVR_SUCCESS;
+}
+
+/**\brief Write a string cmd to a file
+ * \param[in] name, File name
+ * \param[in] cmd, String command
+ * \return DVR_SUCCESS On success
+ * \return Error code On failure
+ */
+
+int dvr_file_echo(const char *name, const char *cmd)
+{
+  int fd, len, ret;
+  if (name == NULL || cmd == NULL) {
+    return DVR_FAILURE;
+  }
+
+  if (rwSysfsCb.writeSysfsCb)
+  {
+    rwSysfsCb.writeSysfsCb(name, cmd);
+    return DVR_SUCCESS;
+  }
+
+  fd = open(name, O_WRONLY);
+  if (fd == -1)
+  {
+    DVR_DEBUG(1, "cannot open file \"%s\"", name);
+    return DVR_FAILURE;
+  }
+
+  len = strlen(cmd);
+
+  ret = write(fd, cmd, len);
+  if (ret != len)
+  {
+    DVR_DEBUG(1, "write failed file:\"%s\" cmd:\"%s\" error:\"%s\"", name, cmd, strerror(errno));
+    close(fd);
+    return DVR_FAILURE;
+  }
+
+  close(fd);
+  return DVR_SUCCESS;
+}
+
+/**\brief read sysfs file
+ * \param[in] name, File name
+ * \param[out] buf, store sysfs node value
+ * \return DVR_SUCCESS On success
+ * \return Error code On failure
+ */
+
+int dvr_file_read(const char *name, char *buf, int len)
+{
+  FILE *fp;
+  char *ret;
+
+  if (name == NULL || buf == NULL) {
+    DVR_DEBUG(1, "dvr_file_read error param is NULL");
+    return DVR_FAILURE;
+  }
+
+  if (rwSysfsCb.readSysfsCb)
+  {
+    rwSysfsCb.readSysfsCb(name, buf, len);
+    return DVR_SUCCESS;
+  }
+
+
+  fp = fopen(name, "r");
+  if (!fp)
+  {
+    DVR_DEBUG(1, "cannot open file \"%s\"", name);
+    return DVR_FAILURE;
+  }
+
+  ret = fgets(buf, len, fp);
+  if (!ret)
+  {
+    DVR_DEBUG(1, "read the file:\"%s\" error:\"%s\" failed", name, strerror(errno));
+  }
+
+  fclose(fp);
+  return ret ? DVR_SUCCESS : DVR_FAILURE;
+}
+
+
+/**\brief Write a string cmd to a prop
+ * \param[in] name, prop name
+ * \param[in] cmd, String command
+ * \return DVR_SUCCESS On success
+ * \return Error code On failure
+ */
+
+int dvr_prop_echo(const char *name, const char *cmd)
+{
+  if (name == NULL || cmd == NULL) {
+    DVR_DEBUG(1, "dvr_prop_echo: error param is NULL");
+    return DVR_FAILURE;
+  }
+
+  if (rwPropCb.writePropCb)
+  {
+    rwPropCb.writePropCb(name, cmd);
+    return DVR_SUCCESS;
+  }
+  DVR_DEBUG(1, "dvr_prop_echo: error writePropCb is NULL");
+  return DVR_FAILURE;
+}
+
+/**\brief read prop value
+ * \param[in] name, prop name
+ * \param[out] buf, store prop node value
+ * \return DVR_SUCCESS On success
+ * \return Error code On failure
+ */
+
+int dvr_prop_read(const char *name, char *buf, int len)
+{
+  if (name == NULL || buf == NULL) {
+    DVR_DEBUG(1, "dvr_prop_read: error param is NULL");
+    return DVR_FAILURE;
+  }
+
+  if (rwPropCb.readPropCb)
+  {
+    rwPropCb.readPropCb(name, buf, len);
+    return DVR_SUCCESS;
+  }
+  DVR_DEBUG(1, "dvr_prop_read: error readPropCb is NULL");
+  return DVR_FAILURE;
+}
+