PageRenderTime 52ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/amplayer/player/player_hwdec.c

https://github.com/J1nx-Hackable-Gadgets/libamplayer-m3
C | 1245 lines | 1087 code | 105 blank | 53 comment | 306 complexity | 4a0d410760ad778f5f90c6f05c87d4dd MD5 | raw file
Possible License(s): LGPL-3.0, CC-BY-SA-3.0, GPL-2.0, GPL-3.0, LGPL-2.1
  1. /*****************************************
  2. * name : av_hwdec.c
  3. * function: decoder hardware relative functions
  4. *date : 2010.2.4
  5. *****************************************/
  6. #include <log_print.h>
  7. #include "stream_decoder.h"
  8. #include "player_priv.h"
  9. #include "player_hwdec.h"
  10. static int check_size_in_buffer(unsigned char *p, int len)
  11. {
  12. unsigned int size;
  13. unsigned char *q = p;
  14. while ((q + 4) < (p + len)) {
  15. size = (*q << 24) | (*(q + 1) << 16) | (*(q + 2) << 8) | (*(q + 3));
  16. if (size & 0xff000000) {
  17. return 0;
  18. }
  19. if (q + size + 4 == p + len) {
  20. return 1;
  21. }
  22. q += size + 4;
  23. }
  24. return 0;
  25. }
  26. static int check_size_in_buffer3(unsigned char *p, int len)
  27. {
  28. unsigned int size;
  29. unsigned char *q = p;
  30. while ((q + 3) < (p + len)) {
  31. size = (*q << 16) | (*(q + 1) << 8) | (*(q + 2));
  32. if (q + size + 3 == p + len) {
  33. return 1;
  34. }
  35. q += size + 3;
  36. }
  37. return 0;
  38. }
  39. static int check_size_in_buffer2(unsigned char *p, int len)
  40. {
  41. unsigned int size;
  42. unsigned char *q = p;
  43. while ((q + 2) < (p + len)) {
  44. size = (*q << 8) | (*(q + 1));
  45. if (q + size + 2 == p + len) {
  46. return 1;
  47. }
  48. q += size + 2;
  49. }
  50. return 0;
  51. }
  52. static const uint32_t sample_rates[] = {
  53. 96000, 88200, 64000, 48000, 44100, 32000,
  54. 24000, 22050, 16000, 12000, 11025, 8000
  55. };
  56. /**********************************************************************
  57. 0: syncword 12 always: '111111111111'
  58. 12: ID 1 0: MPEG-4, 1: MPEG-2
  59. 13: layer 2 always: '00'
  60. 15: protection_absent 1
  61. 16: profile 2
  62. 18: sampling_frequency_index 4
  63. 22: private_bit 1
  64. 23: channel_configuration 3
  65. 26: original/copy 1
  66. 27: home 1
  67. 28: emphasis 2 only if ID == 0
  68. ADTS Variable header: these can change from frame to frame
  69. 28: copyright_identification_bit 1
  70. 29: copyright_identification_start 1
  71. 30: aac_frame_length 13 length of the frame including header (in bytes)
  72. 43: adts_buffer_fullness 11 0x7FF indicates VBR
  73. 54: no_raw_data_blocks_in_frame 2
  74. ADTS Error check
  75. crc_check 16 only if protection_absent == 0
  76. }
  77. **************************************************************************/
  78. int extract_adts_header_info(play_para_t *para)
  79. {
  80. adts_header_t hdr;
  81. AVCodecContext *pCodecCtx;
  82. int aidx = para->astream_info.audio_index;
  83. uint8_t *p = NULL;
  84. uint8_t *buf;
  85. int i;
  86. if (aidx == -1) {
  87. log_print("[%s:%d]no index found\n", __FUNCTION__, __LINE__);
  88. return PLAYER_ADTS_NOIDX;
  89. } else {
  90. pCodecCtx = para->pFormatCtx->streams[aidx]->codec;
  91. log_print("[%s:%d]aidx=%d pCodecCtx=%p\n", __FUNCTION__, __LINE__, aidx, pCodecCtx);
  92. }
  93. if (pCodecCtx->extradata) {
  94. p = pCodecCtx->extradata;
  95. hdr.profile = (*p >> 3) - 1; // 5 bits
  96. hdr.sample_freq_idx = (*p & 0x7) << 1 | (*(p + 1) >> 7); // 4 bits
  97. hdr.channel_configuration = (*(p + 1) & 0x7f) >> 3; // 4 bits
  98. if ((*p >> 3) == 5/*AOT_SBR*/ || ((*p >> 3) == 29/*AOT_PS*/ &&
  99. // check for W6132 Annex YYYY draft MP3onMP4
  100. !((*(p + 1) & 0x7) & 0x03 && !(((*(p + 1) & 0x7) << 6 | (*(p + 2) >> 2)) & 0x3F)))) {
  101. //skip 4 bits for ex-sample-freq_idx
  102. hdr.profile = ((*(p + 2) & 0x7f) >> 2) - 1; // 5 bits
  103. }
  104. log_print("extract aac insert adts header:profile %d,sr_index %d,ch_config %d\n", hdr.profile, hdr.sample_freq_idx, hdr.channel_configuration);
  105. log_print("extra data size %d,DATA:\n", pCodecCtx->extradata_size);
  106. for (i = 0; i < pCodecCtx->extradata_size; i++) {
  107. log_print("[0x%x]\n", p[i]);
  108. }
  109. } else {
  110. hdr.profile = pCodecCtx->audio_profile - 1;
  111. hdr.channel_configuration = pCodecCtx->channels;
  112. for (i = 0; i < sizeof(sample_rates) / sizeof(uint32_t); i ++) {
  113. if (pCodecCtx->sample_rate == sample_rates[i]) {
  114. hdr.sample_freq_idx = i;
  115. }
  116. }
  117. log_print("aac insert adts header:profile %d,sr_index %d,ch_config %d\n", hdr.profile, hdr.sample_freq_idx, hdr.channel_configuration);
  118. }
  119. hdr.syncword = 0xfff;
  120. hdr.id = 0;
  121. hdr.layer = 0;
  122. hdr.protection_absent = 1;
  123. hdr.private_bit = 0;
  124. hdr.original_copy = 0;
  125. hdr.home = 0;
  126. hdr.copyright_identification_bit = 0;
  127. hdr.copyright_identification_start = 0;
  128. hdr.aac_frame_length = 0;
  129. hdr.adts_buffer_fullness = 0x7ff;
  130. hdr.number_of_raw_data_blocks_in_frame = 0;
  131. buf = MALLOC(ADTS_HEADER_SIZE);
  132. if (buf) {
  133. buf[0] = (char)(hdr.syncword >> 4);
  134. buf[1] = (char)((hdr.syncword & 0xf << 4) |
  135. (hdr.id << 3) |
  136. (hdr.layer << 1) |
  137. hdr.protection_absent);
  138. buf[2] = (char)((hdr.profile << 6) |
  139. (hdr.sample_freq_idx << 2) |
  140. (hdr.private_bit << 1) |
  141. (hdr.channel_configuration >> 2));
  142. buf[3] = (char)(((hdr.channel_configuration & 0x3) << 6) |
  143. (hdr.original_copy << 5) |
  144. (hdr.home << 4) |
  145. (hdr.copyright_identification_bit << 3) |
  146. (hdr.copyright_identification_start << 2) |
  147. (hdr.aac_frame_length) >> 11);
  148. buf[4] = (char)((hdr.aac_frame_length >> 3) & 0xff);
  149. buf[5] = (char)(((hdr.aac_frame_length & 0x7) << 5) |
  150. (hdr.adts_buffer_fullness >> 6));
  151. buf[6] = (char)(((hdr.adts_buffer_fullness & 0x3f) << 2) |
  152. hdr.number_of_raw_data_blocks_in_frame);
  153. para->astream_info.extradata = buf;
  154. para->astream_info.extradata_size = ADTS_HEADER_SIZE;
  155. } else {
  156. log_error("[%s:%d]no memory for extract adts header!\n", __FUNCTION__, __LINE__);
  157. return PLAYER_NOMEM;
  158. }
  159. return PLAYER_SUCCESS;
  160. }
  161. void adts_add_header(play_para_t *para)
  162. {
  163. unsigned char *buf ;
  164. am_packet_t *pkt = para->p_pkt;
  165. int i;
  166. int size = ADTS_HEADER_SIZE + pkt->data_size; // 13bit valid
  167. size &= 0x1fff;
  168. buf = para->astream_info.extradata;
  169. uint8_t *adts_header=NULL;
  170. if (pkt->avpkt && (pkt->avpkt->flags & AV_PKT_FLAG_AAC_WITH_ADTS_HEADER)) {
  171. //log_info("have add adts header in low level,don't add again\n");
  172. pkt->hdr->size = 0;
  173. return ; /*have added before */
  174. }
  175. //Some aac es stream already has adts header,need check the first ADTS_HEADER_SIZE bytes
  176. while (pkt->data&&pkt->data_size>=ADTS_HEADER_SIZE) {
  177. adts_header = MALLOC(ADTS_HEADER_SIZE);
  178. if (adts_header) {
  179. memset(adts_header,0,ADTS_HEADER_SIZE);
  180. adts_header=memcpy(adts_header,pkt->data,ADTS_HEADER_SIZE);
  181. }
  182. else break;
  183. if(((adts_header[0]<<4)|(adts_header[1]&0xF0)>>4)!=0xFFF)//sync code
  184. break;
  185. if((( (*(adts_header+ 3)&0x2)<<11)|( (*(adts_header + 4)&0xFF)<<3)|( (*(adts_header + 5)&0xE0)>>5))!=pkt->data_size)//frame length
  186. break;
  187. //log_info(" AAC es has adts header,don't add again\n");
  188. pkt->hdr->size = 0;
  189. return;
  190. }
  191. if(adts_header){
  192. av_free(adts_header);
  193. adts_header=NULL;
  194. }
  195. if (para->astream_info.extradata) {
  196. buf[3] = (buf[3] & 0xfc) | (size >> 11);
  197. buf[4] = (size >> 3) & 0xff;
  198. buf[5] = (buf[5] & 0x1f) | ((size & 0x7) << 5);
  199. if (para->astream_info.extradata_size == ADTS_HEADER_SIZE) {
  200. MEMCPY(pkt->hdr->data, para->astream_info.extradata, para->astream_info.extradata_size);
  201. pkt->hdr->size = ADTS_HEADER_SIZE;
  202. pkt->type = CODEC_AUDIO;
  203. }
  204. }
  205. //else
  206. // log_error("[%s:%d]extradata NULL!\n",__FUNCTION__,__LINE__);
  207. return ;
  208. }
  209. /*************************************************************************/
  210. static int mjpeg_data_prefeeding(am_packet_t *pkt)
  211. {
  212. const unsigned char mjpeg_addon_data[] = {
  213. 0xff, 0xd8, 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
  214. 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
  215. 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x03, 0x01,
  216. 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  217. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10,
  218. 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00,
  219. 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31,
  220. 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1,
  221. 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72,
  222. 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29,
  223. 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47,
  224. 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
  225. 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  226. 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95,
  227. 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
  228. 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4,
  229. 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
  230. 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1,
  231. 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02, 0x01,
  232. 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77,
  233. 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51,
  234. 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
  235. 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24,
  236. 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a,
  237. 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
  238. 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66,
  239. 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82,
  240. 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
  241. 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
  242. 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
  243. 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
  244. 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
  245. 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa
  246. };
  247. if (pkt->hdr->data) {
  248. MEMCPY(pkt->hdr->data, &mjpeg_addon_data, sizeof(mjpeg_addon_data));
  249. pkt->hdr->size = sizeof(mjpeg_addon_data);
  250. } else {
  251. log_print("[mjpeg_data_prefeeding]No enough memory!\n");
  252. return PLAYER_FAILED;
  253. }
  254. return PLAYER_SUCCESS;
  255. }
  256. static int mjpeg_write_header(play_para_t *para)
  257. {
  258. am_packet_t *pkt = para->p_pkt;
  259. mjpeg_data_prefeeding(pkt);
  260. if (para->vcodec) {
  261. pkt->codec = para->vcodec;
  262. } else {
  263. log_print("[mjpeg_write_header]invalid codec!");
  264. return PLAYER_EMPTY_P;
  265. }
  266. pkt->avpkt_newflag = 1;
  267. write_av_packet(para);
  268. return PLAYER_SUCCESS;
  269. }
  270. /*************************************************************************/
  271. static int divx3_data_prefeeding(am_packet_t *pkt, unsigned w, unsigned h)
  272. {
  273. unsigned i = (w << 12) | (h & 0xfff);
  274. unsigned char divx311_add[10] = {
  275. 0x00, 0x00, 0x00, 0x01,
  276. 0x20, 0x00, 0x00, 0x00,
  277. 0x00, 0x00
  278. };
  279. divx311_add[5] = (i >> 16) & 0xff;
  280. divx311_add[6] = (i >> 8) & 0xff;
  281. divx311_add[7] = i & 0xff;
  282. if (pkt->hdr->data) {
  283. MEMCPY(pkt->hdr->data, divx311_add, sizeof(divx311_add));
  284. pkt->hdr->size = sizeof(divx311_add);
  285. } else {
  286. log_print("[divx3_data_prefeeding]No enough memory!\n");
  287. return PLAYER_FAILED;
  288. }
  289. return PLAYER_SUCCESS;
  290. }
  291. static int divx3_write_header(play_para_t *para)
  292. {
  293. am_packet_t *pkt = para->p_pkt;
  294. divx3_data_prefeeding(pkt, para->vstream_info.video_width, para->vstream_info.video_height);
  295. if (para->vcodec) {
  296. pkt->codec = para->vcodec;
  297. } else {
  298. log_print("[divx3_write_header]invalid codec!");
  299. return PLAYER_EMPTY_P;
  300. }
  301. pkt->avpkt_newflag = 1;
  302. write_av_packet(para);
  303. return PLAYER_SUCCESS;
  304. }
  305. /*************************************************************************/
  306. static int h264_add_header(unsigned char *buf, int size, am_packet_t *pkt)
  307. {
  308. char nal_start_code[] = {0x0, 0x0, 0x0, 0x1};
  309. int nalsize;
  310. unsigned char* p;
  311. int tmpi;
  312. unsigned char* extradata = buf;
  313. int header_len = 0;
  314. char* buffer = pkt->hdr->data;
  315. p = extradata;
  316. if ((p[0] == 0 && p[1] == 0 && p[2] == 0 && p[3] == 1)||(p[0] == 0 && p[1] == 0 && p[2] == 1 ) && size < HDR_BUF_SIZE) {
  317. log_print("add 264 header in stream before header len=%d", size);
  318. MEMCPY(buffer, buf, size);
  319. pkt->hdr->size = size;
  320. pkt->type = CODEC_VIDEO;
  321. return PLAYER_SUCCESS;
  322. }
  323. if (size < 4) {
  324. return PLAYER_FAILED;
  325. }
  326. if (size < 10) {
  327. log_print("avcC too short\n");
  328. return PLAYER_FAILED;
  329. }
  330. if (*p != 1) {
  331. log_print(" Unkonwn avcC version %d\n", *p);
  332. return PLAYER_FAILED;
  333. }
  334. int cnt = *(p + 5) & 0x1f; //number of sps
  335. // printf("number of sps :%d\n", cnt);
  336. p += 6;
  337. for (tmpi = 0; tmpi < cnt; tmpi++) {
  338. nalsize = (*p << 8) | (*(p + 1));
  339. MEMCPY(&(buffer[header_len]), nal_start_code, 4);
  340. header_len += 4;
  341. MEMCPY(&(buffer[header_len]), p + 2, nalsize);
  342. header_len += nalsize;
  343. p += (nalsize + 2);
  344. }
  345. cnt = *(p++); //Number of pps
  346. // printf("number of pps :%d\n", cnt);
  347. for (tmpi = 0; tmpi < cnt; tmpi++) {
  348. nalsize = (*p << 8) | (*(p + 1));
  349. MEMCPY(&(buffer[header_len]), nal_start_code, 4);
  350. header_len += 4;
  351. MEMCPY(&(buffer[header_len]), p + 2, nalsize);
  352. header_len += nalsize;
  353. p += (nalsize + 2);
  354. }
  355. if (header_len >= HDR_BUF_SIZE) {
  356. log_print("header_len %d is larger than max length\n", header_len);
  357. return PLAYER_FAILED;
  358. }
  359. pkt->hdr->size = header_len;
  360. pkt->type = CODEC_VIDEO;
  361. return PLAYER_SUCCESS;
  362. }
  363. static int h264_write_header(play_para_t *para)
  364. {
  365. AVStream *pStream = NULL;
  366. AVCodecContext *avcodec;
  367. am_packet_t *pkt = para->p_pkt;
  368. int ret = -1;
  369. int index = para->vstream_info.video_index;
  370. if (-1 == index) {
  371. return PLAYER_ERROR_PARAM;
  372. }
  373. pStream = para->pFormatCtx->streams[index];
  374. avcodec = pStream->codec;
  375. if (avcodec->extradata) {
  376. ret = h264_add_header(avcodec->extradata, avcodec->extradata_size, pkt);
  377. }
  378. if (ret == PLAYER_SUCCESS) {
  379. if (para->vcodec) {
  380. pkt->codec = para->vcodec;
  381. } else {
  382. log_print("[h264_add_header]invalid video codec!\n");
  383. return PLAYER_EMPTY_P;
  384. }
  385. pkt->avpkt_newflag = 1;
  386. ret = write_av_packet(para);
  387. }
  388. return ret;
  389. }
  390. static int write_stream_header(play_para_t *para)
  391. {
  392. AVStream *pStream = NULL;
  393. AVCodecContext *avcodec;
  394. am_packet_t *pkt = para->p_pkt;
  395. int ret = -1;
  396. int index = para->vstream_info.video_index;
  397. if (-1 == index) {
  398. return PLAYER_ERROR_PARAM;
  399. }
  400. pStream = para->pFormatCtx->streams[index];
  401. avcodec = pStream->codec;
  402. ret = PLAYER_FAILED;
  403. if (avcodec->extradata_size < HDR_BUF_SIZE) {
  404. MEMCPY(pkt->hdr->data, avcodec->extradata, avcodec->extradata_size);
  405. pkt->hdr->size = avcodec->extradata_size;
  406. pkt->type = CODEC_VIDEO;
  407. ret = PLAYER_SUCCESS;
  408. }
  409. if (ret == PLAYER_SUCCESS) {
  410. if (para->vcodec) {
  411. pkt->codec = para->vcodec;
  412. } else {
  413. log_print("[h264_add_header]invalid video codec!\n");
  414. return PLAYER_EMPTY_P;
  415. }
  416. pkt->avpkt_newflag = 1;
  417. ret = write_av_packet(para);
  418. }
  419. return ret;
  420. }
  421. /*************************************************************************/
  422. static int m4s2_dx50_mp4v_add_header(unsigned char *buf, int size, am_packet_t *pkt)
  423. {
  424. if (size > pkt->hdr->size) {
  425. FREE(pkt->hdr->data);
  426. pkt->hdr->size = 0;
  427. pkt->hdr->data = (char *)MALLOC(size);
  428. if (!pkt->hdr->data) {
  429. log_print("[m4s2_dx50_add_header] NOMEM!");
  430. return PLAYER_FAILED;
  431. }
  432. }
  433. pkt->hdr->size = size;
  434. pkt->type = CODEC_VIDEO;
  435. MEMCPY(pkt->hdr->data, buf, size);
  436. return PLAYER_SUCCESS;
  437. }
  438. static int m4s2_dx50_mp4v_write_header(play_para_t *para)
  439. {
  440. AVStream *pStream = NULL;
  441. AVCodecContext *avcodec;
  442. int ret = -1;
  443. int index = para->vstream_info.video_index;
  444. am_packet_t * pkt = para->p_pkt;
  445. if (-1 == index) {
  446. return PLAYER_ERROR_PARAM;
  447. }
  448. pStream = para->pFormatCtx->streams[index];
  449. avcodec = pStream->codec;
  450. ret = m4s2_dx50_mp4v_add_header(avcodec->extradata, avcodec->extradata_size, pkt);
  451. if (ret == PLAYER_SUCCESS) {
  452. if (para->vcodec) {
  453. pkt->codec = para->vcodec;
  454. } else {
  455. log_print("[m4s2_dx50_mp4v_add_header]invalid video codec!\n");
  456. return PLAYER_EMPTY_P;
  457. }
  458. pkt->avpkt_newflag = 1;
  459. ret = write_av_packet(para);
  460. }
  461. return ret;
  462. }
  463. /*************************************************************************/
  464. static int avi_add_seqheader(AVStream *pStream, am_packet_t *pkt)
  465. {
  466. AVIStream *avi_stream = pStream->priv_data;
  467. int seq_size = avi_stream->sequence_head_size;
  468. if (seq_size > pkt->hdr->size) {
  469. FREE(pkt->hdr->data);
  470. pkt->hdr->size = 0;
  471. pkt->hdr->data = (char *)MALLOC(seq_size);
  472. if (!pkt->hdr->data) {
  473. log_print("[m4s2_dx50_add_header] NOMEM!");
  474. return PLAYER_FAILED;
  475. }
  476. }
  477. pkt->hdr->size = seq_size;
  478. pkt->type = CODEC_VIDEO;
  479. MEMCPY(pkt->hdr->data, avi_stream->sequence_head, seq_size);
  480. return PLAYER_SUCCESS;
  481. }
  482. static int avi_write_header(play_para_t *para)
  483. {
  484. AVStream *pStream = NULL;
  485. int ret = -1;
  486. int index = para->vstream_info.video_index;
  487. am_packet_t *pkt = para->p_pkt;
  488. AVCodecContext *avcodec;
  489. if (-1 == index) {
  490. return PLAYER_ERROR_PARAM;
  491. }
  492. pStream = para->pFormatCtx->streams[index];
  493. avcodec = pStream->codec;
  494. AVIStream *avi_stream = pStream->priv_data;
  495. int seq_size = avi_stream->sequence_head_size;
  496. if (seq_size > 0)
  497. ret = avi_add_seqheader(pStream, pkt);
  498. else if(avcodec->extradata_size > 4)
  499. ret = m4s2_dx50_mp4v_add_header(avcodec->extradata, avcodec->extradata_size, pkt);
  500. if (ret == PLAYER_SUCCESS) {
  501. if (para->vcodec) {
  502. pkt->codec = para->vcodec;
  503. } else {
  504. log_print("[avi_write_header]invalid video codec!\n");
  505. return PLAYER_EMPTY_P;
  506. }
  507. pkt->avpkt_newflag = 1;
  508. ret = write_av_packet(para);
  509. }
  510. return ret;
  511. }
  512. /*************************************************************************/
  513. static int mkv_write_header(play_para_t *para)
  514. {
  515. int head_size = para->vstream_info.extradata_size;
  516. am_packet_t *pkt = para->p_pkt;
  517. if (para->vcodec) {
  518. pkt->codec = para->vcodec;
  519. } else {
  520. log_print("[mkv_write_header]invalid codec!");
  521. return PLAYER_EMPTY_P;
  522. }
  523. if (head_size > HDR_BUF_SIZE) {
  524. FREE(pkt->hdr->data);
  525. pkt->hdr->size = 0;
  526. pkt->hdr->data = (char *)MALLOC(head_size);
  527. if (!pkt->hdr->data) {
  528. log_print("[mkv_write_header] NOMEM!");
  529. return PLAYER_FAILED;
  530. }
  531. }
  532. pkt->hdr->size = head_size;
  533. pkt->type = CODEC_VIDEO;
  534. MEMCPY(pkt->hdr->data, para->vstream_info.extradata, head_size);
  535. pkt->avpkt_newflag = 1;
  536. return write_av_packet(para);
  537. }
  538. /*************************************************************************/
  539. static int wmv3_write_header(play_para_t *para)
  540. {
  541. unsigned i, check_sum = 0;
  542. unsigned data_len = para->vstream_info.extradata_size + 4;
  543. int ret;
  544. am_packet_t *pkt = para->p_pkt;
  545. pkt->hdr->data[0] = 0;
  546. pkt->hdr->data[1] = 0;
  547. pkt->hdr->data[2] = 1;
  548. pkt->hdr->data[3] = 0x10;
  549. pkt->hdr->data[4] = 0;
  550. pkt->hdr->data[5] = (data_len >> 16) & 0xff;
  551. pkt->hdr->data[6] = 0x88;
  552. pkt->hdr->data[7] = (data_len >> 8) & 0xff;
  553. pkt->hdr->data[8] = data_len & 0xff;
  554. pkt->hdr->data[9] = 0x88;
  555. pkt->hdr->data[10] = 0xff;
  556. pkt->hdr->data[11] = 0xff;
  557. pkt->hdr->data[12] = 0x88;
  558. pkt->hdr->data[13] = 0xff;
  559. pkt->hdr->data[14] = 0xff;
  560. pkt->hdr->data[15] = 0x88;
  561. for (i = 4 ; i < 16 ; i++) {
  562. check_sum += pkt->hdr->data[i];
  563. }
  564. pkt->hdr->data[16] = (check_sum >> 8) & 0xff;
  565. pkt->hdr->data[17] = check_sum & 0xff;
  566. pkt->hdr->data[18] = 0x88;
  567. pkt->hdr->data[19] = (check_sum >> 8) & 0xff;
  568. pkt->hdr->data[20] = check_sum & 0xff;
  569. pkt->hdr->data[21] = 0x88;
  570. pkt->hdr->data[22] = (para->vstream_info.video_width >> 8) & 0xff;
  571. pkt->hdr->data[23] = para->vstream_info.video_width & 0xff;
  572. pkt->hdr->data[24] = (para->vstream_info.video_height >> 8) & 0xff;
  573. pkt->hdr->data[25] = para->vstream_info.video_height & 0xff;
  574. MEMCPY(pkt->hdr->data + 26, para->vstream_info.extradata, para->vstream_info.extradata_size);
  575. pkt->hdr->size = para->vstream_info.extradata_size + 26;
  576. if (para->vcodec) {
  577. pkt->codec = para->vcodec;
  578. } else {
  579. log_print("[wmv3_write_header]invalid codec!");
  580. return PLAYER_EMPTY_P;
  581. }
  582. pkt->avpkt_newflag = 1;
  583. pkt->type = CODEC_VIDEO;
  584. ret = write_av_packet(para);
  585. return ret;
  586. }
  587. /*************************************************************************/
  588. static int wvc1_write_header(play_para_t *para)
  589. {
  590. int ret = -1;
  591. am_packet_t *pkt = para->p_pkt;
  592. MEMCPY(pkt->hdr->data, para->vstream_info.extradata + 1, para->vstream_info.extradata_size - 1);
  593. pkt->hdr->size = para->vstream_info.extradata_size - 1;
  594. if (para->vcodec) {
  595. pkt->codec = para->vcodec;
  596. } else {
  597. log_print("[wvc1_write_header]invalid codec!");
  598. return PLAYER_EMPTY_P;
  599. }
  600. pkt->avpkt_newflag = 1;
  601. pkt->type = CODEC_VIDEO;
  602. ret = write_av_packet(para);
  603. return ret;
  604. }
  605. /*************************************************************************/
  606. int mpeg_check_sequence(play_para_t *para)
  607. {
  608. #define MPEG_PROBE_SIZE (4096)
  609. #define MAX_MPEG_PROBE_SIZE (0x100000) //1M
  610. #define SEQ_START_CODE (0x000001b3)
  611. #define EXT_START_CODE (0x000001b5)
  612. int code = 0;
  613. int pos1 = 0, pos2 = 0;
  614. int i, j;
  615. int len, offset, read_size, seq_size = 0;
  616. int64_t cur_offset = 0;
  617. AVFormatContext *s = para->pFormatCtx;
  618. unsigned char buf[MPEG_PROBE_SIZE];
  619. cur_offset = avio_tell(s->pb);
  620. offset = 0;
  621. len = 0;
  622. for (j = 0; j < (MAX_MPEG_PROBE_SIZE / MPEG_PROBE_SIZE); j++) {
  623. url_fseek(s->pb, offset, SEEK_SET);
  624. read_size = get_buffer(s->pb, buf, MPEG_PROBE_SIZE);
  625. if (read_size < 0) {
  626. log_error("[mpeg_check_sequence:%d] read error: %d\n", __LINE__, read_size);
  627. avio_seek(s->pb, cur_offset, SEEK_SET);
  628. return read_size;
  629. }
  630. offset += read_size;
  631. for (i = 0; i < read_size; i++) {
  632. code = (code << 8) + buf[i];
  633. if ((code & 0xffffff00) == 0x100) {
  634. //log_print("[mpeg_check_sequence:%d]code=%08x\n",__LINE__, code);
  635. if (code == SEQ_START_CODE) {
  636. pos1 = j * MPEG_PROBE_SIZE + i - 3;
  637. } else if (code != EXT_START_CODE) {
  638. pos2 = j * MPEG_PROBE_SIZE + i - 3;
  639. }
  640. if ((pos2 > pos1) && (pos1 > 0)) {
  641. seq_size = pos2 - pos1;
  642. //log_print("[mpeg_check_sequence:%d]pos1=%x pos2=%x seq_size=%d\n",__LINE__, pos1,pos2,seq_size);
  643. break;
  644. }
  645. }
  646. }
  647. if (seq_size > 0) {
  648. break;
  649. }
  650. }
  651. if (seq_size > 0) {
  652. url_fseek(s->pb, pos1, SEEK_SET);
  653. read_size = get_buffer(s->pb, buf, seq_size);
  654. if (read_size < 0) {
  655. log_error("[mpeg_check_sequence:%d] read error: %d\n", __LINE__, read_size);
  656. avio_seek(s->pb, cur_offset, SEEK_SET);
  657. return read_size;
  658. }
  659. #ifdef DEBUG_MPEG_SEARCH
  660. for (i = 0; i < seq_size; i++) {
  661. log_print("%02x ", buf[i]);
  662. if (i % 8 == 7) {
  663. log_print("\n");
  664. }
  665. }
  666. #endif
  667. para->vstream_info.extradata = MALLOC(seq_size);
  668. if (para->vstream_info.extradata) {
  669. MEMCPY(para->vstream_info.extradata, buf, seq_size);
  670. para->vstream_info.extradata_size = seq_size;
  671. #ifdef DEBUG_MPEG_SEARCH
  672. for (i = 0; i < seq_size; i++) {
  673. log_print("%02x ", para->vstream_info.extradata[i]);
  674. if (i % 8 == 7) {
  675. log_print("\n");
  676. }
  677. }
  678. #endif
  679. } else {
  680. log_error("[mpeg_check_sequece:%d] no enough memory !\n", __LINE__);
  681. }
  682. } else {
  683. log_error("[mpeg_check_sequence:%d]max probe size reached! not find sequence header!\n", __LINE__);
  684. }
  685. avio_seek(s->pb, cur_offset, SEEK_SET);
  686. return 0;
  687. }
  688. static int mpeg_add_header(play_para_t *para)
  689. {
  690. #define STUFF_BYTES_LENGTH (256)
  691. int size;
  692. unsigned char packet_wrapper[] = {
  693. 0x00, 0x00, 0x01, 0xe0,
  694. 0x00, 0x00, /* pes packet length */
  695. 0x81, 0xc0, 0x0d,
  696. 0x20, 0x00, 0x00, 0x00, 0x00, /* PTS */
  697. 0x1f, 0xff, 0xff, 0xff, 0xff, /* DTS */
  698. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
  699. };
  700. am_packet_t *pkt = para->p_pkt;
  701. size = para->vstream_info.extradata_size + sizeof(packet_wrapper);
  702. packet_wrapper[4] = size >> 8 ;
  703. packet_wrapper[5] = size & 0xff ;
  704. MEMCPY(pkt->hdr->data, packet_wrapper, sizeof(packet_wrapper));
  705. size = sizeof(packet_wrapper);
  706. //log_print("[mpeg_add_header:%d]wrapper size=%d\n",__LINE__,size);
  707. MEMCPY(pkt->hdr->data + size, para->vstream_info.extradata, para->vstream_info.extradata_size);
  708. size += para->vstream_info.extradata_size;
  709. //log_print("[mpeg_add_header:%d]wrapper+seq size=%d\n",__LINE__,size);
  710. MEMSET(pkt->hdr->data + size, 0xff, STUFF_BYTES_LENGTH);
  711. size += STUFF_BYTES_LENGTH;
  712. pkt->hdr->size = size;
  713. //log_print("[mpeg_add_header:%d]hdr_size=%d\n",__LINE__,size);
  714. if (para->codec) {
  715. pkt->codec = para->codec;
  716. } else {
  717. log_print("[mpeg_add_header]invalid codec!");
  718. return PLAYER_EMPTY_P;
  719. }
  720. #ifdef DEBUG_MPEG_SEARCH
  721. int i;
  722. for (i = 0; i < pkt->hdr->size; i++) {
  723. if (i % 16 == 0) {
  724. log_print("\n");
  725. }
  726. log_print("%02x ", pkt->hdr->data[i]);
  727. }
  728. #endif
  729. pkt->avpkt_newflag = 1;
  730. return write_av_packet(para);
  731. }
  732. static int generate_vorbis_header(unsigned char *extradata, unsigned extradata_size, unsigned char** header_start, unsigned *header_len)
  733. {
  734. #define RB16(x) ((((const uint8_t*)(x))[0] << 8) | ((const uint8_t*)(x))[1])
  735. int i;
  736. int first_header_size = 30;
  737. if (extradata_size >= 6 && RB16(extradata) == first_header_size) {
  738. int overall_len = 6;
  739. for (i=0; i<3; i++) {
  740. header_len[i] = RB16(extradata);
  741. extradata += 2;
  742. header_start[i] = extradata;
  743. extradata += header_len[i];
  744. if (overall_len > extradata_size - header_len[i])
  745. return -1;
  746. overall_len += header_len[i];
  747. }
  748. } else if (extradata_size >= 3 && extradata_size < INT_MAX - 0x1ff && extradata[0] == 2) {
  749. int overall_len = 3;
  750. extradata++;
  751. for (i=0; i<2; i++, extradata++) {
  752. header_len[i] = 0;
  753. for (; overall_len < extradata_size && *extradata==0xff; extradata++) {
  754. header_len[i] += 0xff;
  755. overall_len += 0xff + 1;
  756. }
  757. header_len[i] += *extradata;
  758. overall_len += *extradata;
  759. if (overall_len > extradata_size)
  760. return -1;
  761. }
  762. header_len[2] = extradata_size - overall_len;
  763. header_start[0] = extradata;
  764. header_start[1] = header_start[0] + header_len[0];
  765. header_start[2] = header_start[1] + header_len[1];
  766. } else {
  767. return -1;
  768. }
  769. return 0;
  770. }
  771. static int audio_add_header(play_para_t *para)
  772. {
  773. unsigned ext_size = para->pFormatCtx->streams[para->astream_info.audio_index]->codec->extradata_size;
  774. unsigned char *extradata = para->pFormatCtx->streams[para->astream_info.audio_index]->codec->extradata;
  775. am_packet_t *pkt = para->p_pkt;
  776. if (ext_size > 0) {
  777. log_print("==============audio add header =======================\n");
  778. if (para->astream_info.audio_format == AFORMAT_VORBIS) {
  779. unsigned char* vorbis_headers[3];
  780. unsigned int vorbis_header_sizes[3] = {0, 0, 0};
  781. if (generate_vorbis_header(extradata, ext_size, vorbis_headers, vorbis_header_sizes)) {
  782. log_print("general vorbis header failed,audio not support\n");
  783. return PLAYER_UNSUPPORT_AUDIO;
  784. }
  785. if (pkt->hdr->data) {
  786. FREE(pkt->hdr->data);
  787. }
  788. pkt->hdr->data = (char *)MALLOC(vorbis_header_sizes[0] + vorbis_header_sizes[1] + vorbis_header_sizes[2]);
  789. if (!pkt->hdr->data) {
  790. log_print("malloc %d mem failed,at func %s,line %d\n", \
  791. (vorbis_header_sizes[0] + vorbis_header_sizes[1] + vorbis_header_sizes[2]), __FUNCTION__, __LINE__);
  792. return PLAYER_NOMEM;
  793. }
  794. MEMCPY(pkt->hdr->data, vorbis_headers[0], vorbis_header_sizes[0]);
  795. MEMCPY(pkt->hdr->data + vorbis_header_sizes[0], vorbis_headers[1], vorbis_header_sizes[1]);
  796. MEMCPY(pkt->hdr->data + vorbis_header_sizes[0] + vorbis_header_sizes[1], \
  797. vorbis_headers[2], vorbis_header_sizes[2]);
  798. pkt->hdr->size = (vorbis_header_sizes[0] + vorbis_header_sizes[1] + vorbis_header_sizes[2]);
  799. } else {
  800. MEMCPY(pkt->hdr->data, extradata , ext_size);
  801. pkt->hdr->size = ext_size;
  802. }
  803. pkt->avpkt_newflag = 1;
  804. if (para->acodec) {
  805. pkt->codec = para->acodec;
  806. }
  807. pkt->type = CODEC_AUDIO;
  808. if (ext_size > 4) {
  809. log_print("audio header first four bytes[0x%x],[0x%x],[0x%x],[0x%x]\n", extradata[0], extradata[1], extradata[2], extradata[3]);
  810. }
  811. return write_av_packet(para);
  812. }
  813. return 0;
  814. }
  815. int pre_header_feeding(play_para_t *para)
  816. {
  817. int ret = -1;
  818. AVStream *pStream = NULL;
  819. AVCodecContext *avcodec;
  820. int index = para->vstream_info.video_index;
  821. am_packet_t *pkt = para->p_pkt;
  822. int extra_size = 0;
  823. if (-1 == index) {
  824. return PLAYER_ERROR_PARAM;
  825. }
  826. pStream = para->pFormatCtx->streams[index];
  827. avcodec = pStream->codec;
  828. if (IS_AUIDO_NEED_PREFEED_HEADER(para->astream_info.audio_format) &&
  829. para->astream_info.has_audio) {
  830. if (pkt->hdr == NULL) {
  831. pkt->hdr = MALLOC(sizeof(hdr_buf_t));
  832. extra_size = para->pFormatCtx->streams[para->astream_info.audio_index]->codec->extradata_size;
  833. if (extra_size > 0) {
  834. pkt->hdr->data = (char *)MALLOC(extra_size);
  835. if (!pkt->hdr->data) {
  836. log_print("[pre_header_feeding] NOMEM!");
  837. return PLAYER_NOMEM;
  838. }
  839. }
  840. }
  841. ret = audio_add_header(para);
  842. if (pkt->hdr) {
  843. if (pkt->hdr->data) {
  844. FREE(pkt->hdr->data);
  845. pkt->hdr->data = NULL;
  846. }
  847. FREE(pkt->hdr);
  848. pkt->hdr = NULL;
  849. }
  850. if (ret != PLAYER_SUCCESS) {
  851. return ret;
  852. }
  853. }
  854. if (para->stream_type == STREAM_ES && para->vstream_info.has_video) {
  855. if (pkt->hdr == NULL) {
  856. pkt->hdr = MALLOC(sizeof(hdr_buf_t));
  857. pkt->hdr->data = (char *)MALLOC(HDR_BUF_SIZE);
  858. if (!pkt->hdr->data) {
  859. log_print("[pre_header_feeding] NOMEM!");
  860. return PLAYER_NOMEM;
  861. }
  862. pkt->hdr->size = 0;
  863. }
  864. if (VFORMAT_MJPEG == para->vstream_info.video_format) {
  865. ret = mjpeg_write_header(para);
  866. if (ret != PLAYER_SUCCESS) {
  867. return ret;
  868. }
  869. }
  870. if ((STREAM_FILE == para->file_type)) {
  871. ret = write_stream_header(para);
  872. if (ret != PLAYER_SUCCESS) {
  873. return ret;
  874. }
  875. } else if ((VFORMAT_MPEG4 == para->vstream_info.video_format) &&
  876. (VIDEO_DEC_FORMAT_MPEG4_3 == para->vstream_info.video_codec_type)) {
  877. ret = divx3_write_header(para);
  878. if (ret != PLAYER_SUCCESS) {
  879. return ret;
  880. }
  881. } else if ((VFORMAT_H264 == para->vstream_info.video_format) || (VFORMAT_H264MVC == para->vstream_info.video_format)) {
  882. ret = h264_write_header(para);
  883. if (ret != PLAYER_SUCCESS) {
  884. return ret;
  885. }
  886. } else if ((CODEC_TAG_M4S2 == avcodec->codec_tag) ||
  887. (CODEC_TAG_DX50 == avcodec->codec_tag) ||
  888. (CODEC_TAG_mp4v == avcodec->codec_tag)) {
  889. ret = m4s2_dx50_mp4v_write_header(para);
  890. if (ret != PLAYER_SUCCESS) {
  891. return ret;
  892. }
  893. } else if ((AVI_FILE == para->file_type)
  894. && (VIDEO_DEC_FORMAT_MPEG4_3 != para->vstream_info.video_codec_type)
  895. && (VFORMAT_H264 != para->vstream_info.video_format)
  896. && (VFORMAT_VC1 != para->vstream_info.video_format)) {
  897. ret = avi_write_header(para);
  898. if (ret != PLAYER_SUCCESS) {
  899. return ret;
  900. }
  901. } else if (CODEC_TAG_WMV3 == avcodec->codec_tag) {
  902. ret = wmv3_write_header(para);
  903. if (ret != PLAYER_SUCCESS) {
  904. return ret;
  905. }
  906. } else if ((CODEC_TAG_WVC1 == avcodec->codec_tag) || (CODEC_TAG_WMVA == avcodec->codec_tag)) {
  907. ret = wvc1_write_header(para);
  908. if (ret != PLAYER_SUCCESS) {
  909. return ret;
  910. }
  911. } else if ((MKV_FILE == para->file_type)
  912. && ((VFORMAT_MPEG4 == para->vstream_info.video_format) || (VFORMAT_MPEG12 == para->vstream_info.video_format))) {
  913. ret = mkv_write_header(para);
  914. if (ret != PLAYER_SUCCESS) {
  915. return ret;
  916. }
  917. }
  918. if (pkt->hdr) {
  919. if (pkt->hdr->data) {
  920. FREE(pkt->hdr->data);
  921. pkt->hdr->data = NULL;
  922. }
  923. FREE(pkt->hdr);
  924. pkt->hdr = NULL;
  925. }
  926. } else if (para->stream_type == STREAM_PS && para->vstream_info.has_video && para->playctrl_info.time_point > 0) {
  927. if (pkt->hdr == NULL) {
  928. pkt->hdr = MALLOC(sizeof(hdr_buf_t));
  929. pkt->hdr->data = (char *)MALLOC(HDR_BUF_SIZE);
  930. if (!pkt->hdr->data) {
  931. log_print("[pre_header_feeding] NOMEM!");
  932. return PLAYER_NOMEM;
  933. }
  934. }
  935. if ((CODEC_ID_MPEG1VIDEO == avcodec->codec_id)
  936. || (CODEC_ID_MPEG2VIDEO == avcodec->codec_id)
  937. || (CODEC_ID_MPEG2VIDEO_XVMC == avcodec->codec_id)) {
  938. ret = mpeg_add_header(para);
  939. if (ret != PLAYER_SUCCESS) {
  940. return ret;
  941. }
  942. }
  943. if (pkt->hdr) {
  944. if (pkt->hdr->data) {
  945. FREE(pkt->hdr->data);
  946. pkt->hdr->data = NULL;
  947. }
  948. FREE(pkt->hdr);
  949. pkt->hdr = NULL;
  950. }
  951. }
  952. return PLAYER_SUCCESS;
  953. }
  954. int h264_update_frame_header(am_packet_t *pkt)
  955. {
  956. int nalsize, size = pkt->data_size;
  957. unsigned char *data = pkt->data;
  958. unsigned char *p = data;
  959. if (p != NULL) {
  960. if (check_size_in_buffer(p, size)) {
  961. while ((p + 4) < (data + size)) {
  962. nalsize = (*p << 24) | (*(p + 1) << 16) | (*(p + 2) << 8) | (*(p + 3));
  963. *p = 0;
  964. *(p + 1) = 0;
  965. *(p + 2) = 0;
  966. *(p + 3) = 1;
  967. p += (nalsize + 4);
  968. }
  969. return PLAYER_SUCCESS;
  970. } else if (check_size_in_buffer3(p, size)) {
  971. while ((p + 3) < (data + size)) {
  972. nalsize = (*p << 16) | (*(p + 1) << 8) | (*(p + 2));
  973. *p = 0;
  974. *(p + 1) = 0;
  975. *(p + 2) = 1;
  976. p += (nalsize + 3);
  977. }
  978. return PLAYER_SUCCESS;
  979. } else if (check_size_in_buffer2(p, size)) {
  980. unsigned char *new_data;
  981. int new_len = 0;
  982. new_data = (unsigned char *)MALLOC(size + 2 * 1024);
  983. if (!new_data) {
  984. return PLAYER_NOMEM;
  985. }
  986. while ((p + 2) < (data + size)) {
  987. nalsize = (*p << 8) | (*(p + 1));
  988. *(new_data + new_len) = 0;
  989. *(new_data + new_len + 1) = 0;
  990. *(new_data + new_len + 2) = 0;
  991. *(new_data + new_len + 3) = 1;
  992. memcpy(new_data + new_len + 4, p + 2, nalsize);
  993. p += (nalsize + 2);
  994. new_len += nalsize + 4;
  995. }
  996. FREE(pkt->buf);
  997. pkt->buf = new_data;
  998. pkt->buf_size = size + 2 * 1024;
  999. pkt->data = pkt->buf;
  1000. pkt->data_size = new_len;
  1001. }
  1002. } else {
  1003. log_error("[%s]invalid pointer!\n", __FUNCTION__);
  1004. return PLAYER_FAILED;
  1005. }
  1006. return PLAYER_SUCCESS;
  1007. }
  1008. int divx3_prefix(am_packet_t *pkt)
  1009. {
  1010. #define DIVX311_CHUNK_HEAD_SIZE 13
  1011. const unsigned char divx311_chunk_prefix[DIVX311_CHUNK_HEAD_SIZE] = {
  1012. 0x00, 0x00, 0x00, 0x01, 0xb6, 'D', 'I', 'V', 'X', '3', '.', '1', '1'
  1013. };
  1014. if ((pkt->hdr != NULL) && (pkt->hdr->data != NULL)) {
  1015. FREE(pkt->hdr->data);
  1016. pkt->hdr->data = NULL;
  1017. }
  1018. if (pkt->hdr == NULL) {
  1019. pkt->hdr = MALLOC(sizeof(hdr_buf_t));
  1020. if (!pkt->hdr) {
  1021. log_print("[divx3_prefix] NOMEM!");
  1022. return PLAYER_FAILED;
  1023. }
  1024. pkt->hdr->data = NULL;
  1025. pkt->hdr->size = 0;
  1026. }
  1027. pkt->hdr->data = MALLOC(DIVX311_CHUNK_HEAD_SIZE + 4);
  1028. if (pkt->hdr->data == NULL) {
  1029. log_print("[divx3_prefix] NOMEM!");
  1030. return PLAYER_FAILED;
  1031. }
  1032. MEMCPY(pkt->hdr->data, divx311_chunk_prefix, DIVX311_CHUNK_HEAD_SIZE);
  1033. pkt->hdr->data[DIVX311_CHUNK_HEAD_SIZE + 0] = (pkt->data_size >> 24) & 0xff;
  1034. pkt->hdr->data[DIVX311_CHUNK_HEAD_SIZE + 1] = (pkt->data_size >> 16) & 0xff;
  1035. pkt->hdr->data[DIVX311_CHUNK_HEAD_SIZE + 2] = (pkt->data_size >> 8) & 0xff;
  1036. pkt->hdr->data[DIVX311_CHUNK_HEAD_SIZE + 3] = pkt->data_size & 0xff;
  1037. pkt->hdr->size = DIVX311_CHUNK_HEAD_SIZE + 4;
  1038. pkt->avpkt_newflag = 1;
  1039. return PLAYER_SUCCESS;
  1040. }
  1041. int get_vc1_di(unsigned char *data, int length)
  1042. {
  1043. int i, j;
  1044. int profile;
  1045. int interlace, FCM1;
  1046. if (length < 22) {
  1047. return 0;
  1048. }
  1049. if (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x01 && data[3] == 0x0f) {
  1050. /* sequence header */
  1051. profile = (data[4] >> 6) & 0x03;
  1052. log_print("data[4] 0x%x, profile 0x%x\n", data[4], profile);
  1053. if (profile != 3) {// not advanced profile
  1054. return 0;
  1055. }
  1056. interlace = (data[9] >> 6) & 0x01;
  1057. log_print("data[9] 0x%x, interlace 0x%x\n", data[9], interlace);
  1058. if (interlace == 0) {
  1059. return 0;
  1060. }
  1061. i = 22;
  1062. j = i + 4;
  1063. while (j < length) { // search key word 0x0000010d
  1064. if (data[i] == 0x00 && data[i+1] == 0x00 && data[i+2] == 0x01 && data[i+3] == 0x0d) {
  1065. break;
  1066. }
  1067. i++;
  1068. j++;
  1069. }
  1070. if (j >= length) {
  1071. return 0;
  1072. }
  1073. FCM1 = (data[j] >> 7) & 0x01;
  1074. log_print("FCM j %d, data[%d] 0x%x, FCM1 0x%x\n", j, j, data[j], FCM1);
  1075. if (FCM1 == 1) {
  1076. return 1;
  1077. } else {
  1078. return 0;
  1079. }
  1080. }
  1081. return 0;
  1082. }
  1083. int h264_write_end_header(play_para_t *para)
  1084. {
  1085. int ret;
  1086. unsigned char *tmp_data = NULL;
  1087. unsigned char end_header[] = {
  1088. 0x00, 0x00, 0x00, 0x01, 0x06, 0x05, 0xff, 0xe4, 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7,
  1089. 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef, 0x78, 0x32, 0x36, 0x34, 0x20, 0x2d, 0x20, 0x63,
  1090. 0x6f, 0x72, 0x65, 0x20, 0x36, 0x37, 0x20, 0x72, 0x31, 0x31, 0x33, 0x30, 0x20, 0x38, 0x34, 0x37,
  1091. 0x35, 0x39, 0x37, 0x37, 0x20, 0x2d, 0x20, 0x48, 0x2e, 0x32, 0x36, 0x34, 0x2f, 0x4d, 0x50, 0x45,
  1092. 0x47, 0x2d, 0x34, 0x20, 0x41, 0x56, 0x43, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x20, 0x2d, 0x20,
  1093. 0x43, 0x6f, 0x70, 0x79, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30,
  1094. 0x30, 0x39, 0x20, 0x2d, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
  1095. 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x61, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x32, 0x36,
  1096. 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x2d, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
  1097. 0x3a, 0x20, 0x63, 0x61, 0x62, 0x61, 0x63, 0x3d, 0x31, 0x20, 0x72, 0x65, 0x66, 0x3d, 0x31, 0x20,
  1098. 0x64, 0x65, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3d, 0x31, 0x3a, 0x30, 0x3a, 0x30, 0x20, 0x61, 0x6e,
  1099. 0x61, 0x6c, 0x79, 0x73, 0x65, 0x3d, 0x30, 0x78, 0x31, 0x3a, 0x30, 0x78, 0x31, 0x31, 0x31, 0x20,
  1100. 0x6d, 0x65, 0x3d, 0x68, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x65, 0x3d, 0x36, 0x20, 0x70,
  1101. 0x73, 0x79, 0x5f, 0x72, 0x64, 0x3d, 0x31, 0x2e, 0x30, 0x3a, 0x30, 0x2e, 0x30, 0x20, 0x6d, 0x69,
  1102. 0x78, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x3d, 0x30, 0x20, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x6e,
  1103. 0x67, 0x65, 0x3d, 0x31, 0x36, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x5f, 0x6d, 0x65, 0x3d,
  1104. 0x31, 0x20, 0x74, 0x72, 0x65, 0x6c, 0x6c, 0x69, 0x73, 0x3d, 0x30, 0x20, 0x38, 0x78, 0x38, 0x64,
  1105. 0x63, 0x74, 0x3d, 0x30, 0x20, 0x63, 0x71, 0x6d, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x61, 0x64, 0x7a,
  1106. 0x6f, 0x6e, 0x65, 0x3d, 0x32, 0x31, 0x2c, 0x31, 0x31, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61,
  1107. 0x5f, 0x71, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x2d, 0x32, 0x20, 0x74, 0x68,
  1108. 0x72, 0x65, 0x61, 0x64, 0x73, 0x3d, 0x31, 0x20, 0x6e, 0x72, 0x3d, 0x30, 0x20, 0x64, 0x65, 0x63,
  1109. 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3d, 0x31, 0x20, 0x6d, 0x62, 0x61, 0x66, 0x66, 0x3d, 0x30, 0x20,
  1110. 0x62, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x3d, 0x30, 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74,
  1111. 0x3d, 0x32, 0x35, 0x30, 0x20, 0x6b, 0x65, 0x79, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x3d,
  1112. 0x32, 0x35, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x63, 0x75, 0x74, 0x3d, 0x34, 0x30, 0x20, 0x72,
  1113. 0x63, 0x3d, 0x61, 0x62, 0x72, 0x20, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x3d, 0x31, 0x30,
  1114. 0x20, 0x72, 0x61, 0x74, 0x65, 0x74, 0x6f, 0x6c, 0x3d, 0x31, 0x2e, 0x30, 0x20, 0x71, 0x63, 0x6f,
  1115. 0x6d, 0x70, 0x3d, 0x30, 0x2e, 0x36, 0x30, 0x20, 0x71, 0x70, 0x6d, 0x69, 0x6e, 0x3d, 0x31, 0x30,
  1116. 0x20, 0x71, 0x70, 0x6d, 0x61, 0x78, 0x3d, 0x35, 0x31, 0x20, 0x71, 0x70, 0x73, 0x74, 0x65, 0x70,
  1117. 0x3d, 0x34, 0x20, 0x69, 0x70, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x3d, 0x31, 0x2e, 0x34, 0x30,
  1118. 0x20, 0x61, 0x71, 0x3d, 0x31, 0x3a, 0x31, 0x2e, 0x30, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01,
  1119. 0x67, 0x4d, 0x40, 0x0a, 0x9a, 0x74, 0xf4, 0x20, 0x00, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x06,
  1120. 0x51, 0xe2, 0x44, 0xd4, 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x32, 0xc8, 0x00, 0x00, 0x00, 0x01,
  1121. 0x65, 0x88, 0x80, 0x20, 0x00, 0x08, 0x7f, 0xea, 0x6a, 0xe2, 0x99, 0xb6, 0x57, 0xae, 0x49, 0x30,
  1122. 0xf5, 0xfe, 0x5e, 0x46, 0x0b, 0x72, 0x44, 0xc4, 0xe1, 0xfc, 0x62, 0xda, 0xf1, 0xfb, 0xa2, 0xdb,
  1123. 0xd6, 0xbe, 0x5c, 0xd7, 0x24, 0xa3, 0xf5, 0xb9, 0x2f, 0x57, 0x16, 0x49, 0x75, 0x47, 0x77, 0x09,
  1124. 0x5c, 0xa1, 0xb4, 0xc3, 0x4f, 0x60, 0x2b, 0xb0, 0x0c, 0xc8, 0xd6, 0x66, 0xba, 0x9b, 0x82, 0x29,
  1125. 0x33, 0x92, 0x26, 0x99, 0x31, 0x1c, 0x7f, 0x9b
  1126. };
  1127. int header_size = sizeof(end_header) / sizeof(unsigned char);
  1128. tmp_data = MALLOC(1024);
  1129. if (!tmp_data) {
  1130. return 0;
  1131. }
  1132. MEMSET(tmp_data, 0, 1024);
  1133. MEMCPY(tmp_data, &end_header, header_size);
  1134. ret = codec_write(para->vcodec, (void *)tmp_data, 1024);
  1135. log_print("[%s:%d]ret %d\n", __FUNCTION__, __LINE__, ret);
  1136. FREE(tmp_data);
  1137. return ret;
  1138. }