| 72 | } |
| 73 | |
| 74 | static int ftr_decode_frame(AVCodecContext *avctx, AVFrame *frame, |
| 75 | int *got_frame, AVPacket *avpkt) |
| 76 | { |
| 77 | FTRContext *s = avctx->priv_data; |
| 78 | GetBitContext gb; |
| 79 | int ret, ch_offset = 0; |
| 80 | |
| 81 | ret = init_get_bits8(&gb, avpkt->data, avpkt->size); |
| 82 | if (ret < 0) |
| 83 | return ret; |
| 84 | |
| 85 | frame->nb_samples = 0; |
| 86 | |
| 87 | for (int i = 0; i < s->nb_context; i++) { |
| 88 | AVCodecContext *codec_avctx = s->aac_avctx[i]; |
| 89 | GetBitContext gb2 = gb; |
| 90 | AACADTSHeaderInfo hdr_info; |
| 91 | int size; |
| 92 | |
| 93 | if (get_bits_left(&gb) < 64) |
| 94 | return AVERROR_INVALIDDATA; |
| 95 | |
| 96 | memset(&hdr_info, 0, sizeof(hdr_info)); |
| 97 | |
| 98 | size = ff_adts_header_parse(&gb2, &hdr_info); |
| 99 | if (size <= 0 || size * 8 > get_bits_left(&gb)) |
| 100 | return AVERROR_INVALIDDATA; |
| 101 | |
| 102 | if (size > s->packet->size) { |
| 103 | ret = av_grow_packet(s->packet, size - s->packet->size); |
| 104 | if (ret < 0) |
| 105 | return ret; |
| 106 | } |
| 107 | |
| 108 | ret = av_packet_make_writable(s->packet); |
| 109 | if (ret < 0) |
| 110 | return ret; |
| 111 | |
| 112 | memcpy(s->packet->data, avpkt->data + (get_bits_count(&gb) >> 3), size); |
| 113 | s->packet->size = size; |
| 114 | |
| 115 | if (size > 12) { |
| 116 | uint8_t *buf = s->packet->data; |
| 117 | |
| 118 | if (buf[3] & 0x20) { |
| 119 | int tmp = buf[8]; |
| 120 | buf[ 9] = ~buf[9]; |
| 121 | buf[11] = ~buf[11]; |
| 122 | buf[12] = ~buf[12]; |
| 123 | buf[ 8] = ~buf[10]; |
| 124 | buf[10] = ~tmp; |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | ret = avcodec_send_packet(codec_avctx, s->packet); |
| 129 | if (ret < 0) { |
| 130 | av_log(avctx, AV_LOG_ERROR, "Error submitting a packet for decoding\n"); |
| 131 | return ret; |
nothing calls this directly
no test coverage detected