Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

mpeg-muxer.c 3.1KB

il y a 10 mois
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <assert.h>
  2. #include <stdlib.h>
  3. #include "mpeg-muxer.h"
  4. struct mpeg_muxer_t {
  5. int is_ps;
  6. union {
  7. struct {
  8. void *ctx;
  9. void *param;
  10. mpeg_muxer_func_t func;
  11. } ts;
  12. struct ps_muxer_t *ps;
  13. } u;
  14. };
  15. static void *on_mpeg_ts_alloc(void *param, size_t bytes) {
  16. mpeg_muxer_t *mpeg = (mpeg_muxer_t *) param;
  17. return mpeg->u.ts.func.alloc(mpeg->u.ts.param, bytes);
  18. }
  19. static void on_mpeg_ts_free(void *param, void *packet) {
  20. mpeg_muxer_t *mpeg = (mpeg_muxer_t *) param;
  21. mpeg->u.ts.func.free(mpeg->u.ts.param, packet);
  22. }
  23. static int on_mpeg_ts_write(void *param, const void *packet, size_t bytes) {
  24. mpeg_muxer_t *mpeg = (mpeg_muxer_t *) param;
  25. return mpeg->u.ts.func.write(mpeg->u.ts.param, 0, (void *) packet, bytes);
  26. }
  27. mpeg_muxer_t *mpeg_muxer_create(int is_ps, const mpeg_muxer_func_t *func, void *param) {
  28. mpeg_muxer_t *mpeg = (mpeg_muxer_t *) malloc(sizeof(mpeg_muxer_t));
  29. assert(mpeg);
  30. mpeg->is_ps = is_ps;
  31. if (is_ps) {
  32. mpeg->u.ps = ps_muxer_create(func, param);
  33. } else {
  34. struct mpeg_ts_func_t ts_func = {on_mpeg_ts_alloc, on_mpeg_ts_free, on_mpeg_ts_write};
  35. mpeg->u.ts.func = *func;
  36. mpeg->u.ts.param = param;
  37. mpeg->u.ts.ctx = mpeg_ts_create(&ts_func, mpeg);
  38. }
  39. return mpeg;
  40. }
  41. int mpeg_muxer_destroy(mpeg_muxer_t *muxer) {
  42. assert(muxer);
  43. int ret = -1;
  44. if (muxer->is_ps) {
  45. ret = ps_muxer_destroy(muxer->u.ps);
  46. } else {
  47. ret = mpeg_ts_destroy(muxer->u.ts.ctx);
  48. }
  49. free(muxer);
  50. return ret;
  51. }
  52. int mpeg_muxer_add_stream(mpeg_muxer_t *muxer, int codecid, const void *extradata, size_t extradata_size) {
  53. assert(muxer);
  54. if (muxer->is_ps) {
  55. return ps_muxer_add_stream(muxer->u.ps, codecid, extradata, extradata_size);
  56. }
  57. return mpeg_ts_add_stream(muxer->u.ts.ctx, codecid, extradata, extradata_size);
  58. }
  59. int mpeg_muxer_input(mpeg_muxer_t *muxer, int stream, int flags, int64_t pts, int64_t dts, const void *data, size_t bytes) {
  60. assert(muxer);
  61. if (muxer->is_ps) {
  62. return ps_muxer_input(muxer->u.ps, stream, flags, pts, dts, data, bytes);
  63. }
  64. return mpeg_ts_write(muxer->u.ts.ctx, stream, flags, pts, dts, data, bytes);
  65. }
  66. int mpeg_muxer_reset(mpeg_muxer_t *muxer) {
  67. assert(muxer);
  68. if (muxer->is_ps) {
  69. return -1;
  70. }
  71. return mpeg_ts_reset(muxer->u.ts.ctx);
  72. }
  73. int mpeg_muxer_add_program(mpeg_muxer_t *muxer, uint16_t pn, const void *info, int bytes) {
  74. assert(muxer);
  75. if (muxer->is_ps) {
  76. return -1;
  77. }
  78. return mpeg_ts_add_program(muxer->u.ts.ctx, pn, info, bytes);
  79. }
  80. int mpeg_muxer_remove_program(mpeg_muxer_t *muxer, uint16_t pn) {
  81. assert(muxer);
  82. if (muxer->is_ps) {
  83. return -1;
  84. }
  85. return mpeg_ts_remove_program(muxer->u.ts.ctx, pn);
  86. }
  87. int mpeg_muxer_add_program_stream(mpeg_muxer_t *muxer, uint16_t pn, int codecid, const void *extra_data, size_t extra_data_size) {
  88. assert(muxer);
  89. if (muxer->is_ps) {
  90. return -1;
  91. }
  92. return mpeg_ts_add_program_stream(muxer->u.ts.ctx, pn, codecid, extra_data, extra_data_size);
  93. }