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 | |
15 | pcm51_encoded_info_t dts_transenc_info; |
16 | static int dts_init_flag = 0; |
17 | char *stream; //input raw pcm |
18 | char *output; |
19 | static int write_success_flag = 1; |
20 | unsigned int input_size; |
21 | unsigned int output_size; |
22 | static int nNumFrmCoded; |
23 | //sjw added ; param set by shaoshuai |
24 | typedef 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 | |
30 | static ecoder_operations enc_ops; |
31 | |
32 | int 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; |
72 | err1: |
73 | return -1; |
74 | err2: |
75 | pcmenc_deinit();//xujian |
76 | return -1; |
77 | err3: |
78 | pcmenc_deinit();//xujian |
79 | iec958_deinit();//xujian |
80 | return -1; |
81 | err4: |
82 | pcmenc_deinit();//xujian |
83 | iec958_deinit();//xujian |
84 | dlclose(fd_dtsenc); |
85 | return -1; |
86 | } |
87 | |
88 | int 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 | |
129 | int 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 |