You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.1KB

  1. #include "flv-parser.h"
  2. #include "mov-writer.h"
  3. #include "mov-format.h"
  4. #include "mpeg4-aac.h"
  5. #include "flv-proto.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10. extern "C" const struct mov_buffer_t* mov_file_buffer(void);
  11. static uint8_t s_buffer[2 * 1024 * 1024];
  12. static int s_width, s_height;
  13. static int OnAVPacket(void* param, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags)
  14. {
  15. mov_writer_t* mov = (mov_writer_t*)param;
  16. static int s_aac_track = -1;
  17. static int s_avc_track = -1;
  18. switch (codec)
  19. {
  20. case FLV_AUDIO_AAC:
  21. return mov_writer_write(mov, s_aac_track, data, bytes, pts, dts, 1 == flags ? MOV_AV_FLAG_KEYFREAME : 0);
  22. case FLV_AUDIO_MP3:
  23. assert(0);
  24. break;
  25. case FLV_VIDEO_H264:
  26. return mov_writer_write(mov, s_avc_track, data, bytes, pts, dts, flags);
  27. case FLV_VIDEO_AVCC:
  28. if (-1 == s_avc_track)
  29. {
  30. s_avc_track = mov_writer_add_video(mov, MOV_OBJECT_H264, s_width, s_height, data, bytes);
  31. }
  32. break;
  33. case FLV_AUDIO_ASC:
  34. if (-1 == s_aac_track)
  35. {
  36. struct mpeg4_aac_t aac;
  37. mpeg4_aac_audio_specific_config_load((const uint8_t*)data, bytes, &aac);
  38. int rate = mpeg4_aac_audio_frequency_to((enum mpeg4_aac_frequency)aac.sampling_frequency_index);
  39. s_aac_track = mov_writer_add_audio(mov, MOV_OBJECT_AAC, aac.channel_configuration, 16, rate, data, bytes);
  40. }
  41. break;
  42. default:
  43. // nothing to do
  44. //assert(0);
  45. break;
  46. }
  47. printf("\n");
  48. return 0;
  49. }
  50. void flv_parser_test(const char* flv)
  51. {
  52. uint8_t len[2];
  53. static uint8_t buffer[8*1024];
  54. snprintf((char*)buffer, sizeof(buffer), "%s.mp4", flv);
  55. FILE* fp = fopen(flv, "rb");
  56. FILE* wfp = fopen((char*)buffer, "wb");
  57. mov_writer_t* mov = mov_writer_create(mov_file_buffer(), wfp, 0);
  58. flv_parser_t parser;
  59. memset(&parser, 0, sizeof(parser));
  60. for (int r = fread(len, 1, sizeof(len), fp); r == 2; r = fread(len, 1, sizeof(len), fp))
  61. {
  62. unsigned int n = (((unsigned int)len[0]) << 8) | len[1];
  63. assert(n <= sizeof(buffer));
  64. r = fread(buffer, 1, n, fp);
  65. assert(r == n);
  66. assert(0 == flv_parser_input(&parser, buffer, r, OnAVPacket, mov));
  67. }
  68. mov_writer_destroy(mov);
  69. fclose(wfp);
  70. fclose(fp);
  71. }