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;
+}
+