summaryrefslogtreecommitdiff
path: root/amadec/dts_transenc_api.c (plain)
blob: 6aba807672a10b12fd364f5fe702619f3c3eb400
1
2#include <stdio.h>
3#include <string.h>
4#include <fcntl.h>
5#include <stdlib.h>
6#include <math.h>
7#include <dlfcn.h>
8
9#include "dts_transenc_api.h"
10#include "pcmenc_api.h" //xujian
11#include "spdif_api.h" //xujian
12#include <log-print.h>
13#include <amthreadpool.h>
14
15pcm51_encoded_info_t dts_transenc_info;
16static int dts_init_flag = 0;
17char *stream; //input raw pcm
18char *output;
19static int write_success_flag = 1;
20unsigned int input_size;
21unsigned int output_size;
22static int nNumFrmCoded;
23//sjw added ; param set by shaoshuai
24typedef struct {
25 int (*enc_init)(pcm51_encoded_info_t dts_transenc_info, unsigned int *input_size, unsigned int *output_size);
26 int (*enc_encode)(pcm51_encoded_info_t dts_transenc_info, char *stream, unsigned char *output, unsigned int output_size);
27 int (*enc_release)();
28} ecoder_operations;
29
30static ecoder_operations enc_ops;
31
32int dts_transenc_init()
33{
34 int rv;
35 dts_init_flag = 0;
36 write_success_flag = 1;
37 rv = pcmenc_init();//xujian
38 if (rv == -1) {
39 adec_print("==pcmenc_init failed \n");
40 goto err1;
41 }
42 rv = iec958_init();//xujian
43 if (rv != 0) {
44 adec_print("==iec958_init failed ret:%d\n", rv);
45 goto err2;
46 }
47 rv = pcmenc_get_pcm_info(&dts_transenc_info);//xujian
48 if (dts_transenc_info.LFEFlag > 1) {
49 dts_transenc_info.LFEFlag = 1;
50 }
51 void *fd_dtsenc = dlopen("libdtsenc.so", RTLD_NOW);
52 if (fd_dtsenc != 0) {
53 enc_ops.enc_init = dlsym(fd_dtsenc, "init");
54 enc_ops.enc_encode = dlsym(fd_dtsenc, "encode_frame");
55 enc_ops.enc_release = dlsym(fd_dtsenc, "release");
56 } else {
57 adec_print("==find libdtsenc.so failed \n");
58 goto err3;
59 }
60
61 rv = enc_ops.enc_init(dts_transenc_info, &input_size, &output_size);//encode init
62 if (rv != 0) {
63 goto err4;
64 }
65
66 stream = (char *)malloc(input_size); //malloc input buf
67 output = malloc(output_size); //malloc output buf
68
69 dts_init_flag = 1;
70
71 return dts_init_flag;
72err1:
73 return -1;
74err2:
75 pcmenc_deinit();//xujian
76 return -1;
77err3:
78 pcmenc_deinit();//xujian
79 iec958_deinit();//xujian
80 return -1;
81err4:
82 pcmenc_deinit();//xujian
83 iec958_deinit();//xujian
84 dlclose(fd_dtsenc);
85 return -1;
86}
87
88int dts_transenc_process_frame()
89{
90 int rv;
91 if (write_success_flag) {
92 rv = pcmenc_read_pcm(stream, input_size); //xujian
93 if (rv == 0) { /* no enough pcm data in the buffer */
94 //adec_print("=====read data failed :%d input_size:%d \n",rv,input_size);
95 if (iec958_check_958buf_level() == 0) {
96 adec_print("transenc:insert zero pcm data \n");
97 memset(stream, 0, input_size); //insert zero pcm data when 958 hw buffer underrun
98 } else {
99 amthreadpool_thread_usleep(1000);
100 return -1;
101 }
102 }
103#ifdef DUMP_FILE
104 FILE *fp1 = fopen("/mnt/sda4/a.pcm", "a+");
105 fwrite(stream, 1, input_size, fp1);
106 fclose(fp1);
107#endif
108
109 rv = enc_ops.enc_encode(dts_transenc_info, stream, output, (unsigned int)&output_size);//encode frame
110#ifdef DUMP_FILE
111 FILE *fp2 = fopen("/mnt/sda4/a.dts", "a+");
112 fwrite(output, 1, output_size, fp2);
113 fclose(fp2);
114#endif
115 rv = iec958_pack_frame(output, output_size);
116 }
117 rv = iec958_packed_frame_write_958buf(output, output_size);
118 if (rv == -1) {
119 write_success_flag = 0;
120 amthreadpool_thread_usleep(1000);
121 } else {
122 write_success_flag = 1;
123 }
124
125 //adec_print("===pack frame write 958 ret:%d size:%d \n",rv,output_size);
126 return 1;
127}
128
129int dts_transenc_deinit()
130{
131 iec958_deinit();//xujian
132 pcmenc_deinit();//xujian
133 enc_ops.enc_release();
134 if (stream) {
135 free(stream);
136 }
137 stream = NULL;
138 if (output) {
139 free(output);
140 }
141 output = NULL;
142 return 1;
143}
144