~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/s302m.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2012-01-12 22:23:28 UTC
  • mfrom: (0.4.7 sid)
  • mto: This revision was merged to the branch mainline in revision 76.
  • Revision ID: package-import@ubuntu.com-20120112222328-8jqdyodym3p84ygu
Tags: 2:1.0~rc4.dfsg1+svn34540-1
* New upstream snapshot
* upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
#define AES3_HEADER_LEN 4
27
27
 
 
28
typedef struct S302MDecodeContext {
 
29
    AVFrame frame;
 
30
} S302MDecodeContext;
 
31
 
28
32
static int s302m_parse_frame_header(AVCodecContext *avctx, const uint8_t *buf,
29
33
                                    int buf_size)
30
34
{
58
62
    /* Set output properties */
59
63
    avctx->bits_per_coded_sample = bits;
60
64
    if (bits > 16)
61
 
        avctx->sample_fmt = SAMPLE_FMT_S32;
 
65
        avctx->sample_fmt = AV_SAMPLE_FMT_S32;
62
66
    else
63
 
        avctx->sample_fmt = SAMPLE_FMT_S16;
 
67
        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
64
68
 
65
69
    avctx->channels    = channels;
66
70
    avctx->sample_rate = 48000;
73
77
}
74
78
 
75
79
static int s302m_decode_frame(AVCodecContext *avctx, void *data,
76
 
                              int *data_size, AVPacket *avpkt)
 
80
                              int *got_frame_ptr, AVPacket *avpkt)
77
81
{
 
82
    S302MDecodeContext *s = avctx->priv_data;
78
83
    const uint8_t *buf = avpkt->data;
79
84
    int buf_size       = avpkt->size;
 
85
    int block_size, ret;
80
86
 
81
87
    int frame_size = s302m_parse_frame_header(avctx, buf, buf_size);
82
88
    if (frame_size < 0)
85
91
    buf_size -= AES3_HEADER_LEN;
86
92
    buf      += AES3_HEADER_LEN;
87
93
 
88
 
    if (*data_size < 4 * buf_size * 8 / (avctx->bits_per_coded_sample + 4))
89
 
        return -1;
 
94
    /* get output buffer */
 
95
    block_size = (avctx->bits_per_coded_sample + 4) / 4;
 
96
    s->frame.nb_samples = 2 * (buf_size / block_size) / avctx->channels;
 
97
    if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
 
98
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 
99
        return ret;
 
100
    }
 
101
 
 
102
    buf_size = (s->frame.nb_samples * avctx->channels / 2) * block_size;
90
103
 
91
104
    if (avctx->bits_per_coded_sample == 24) {
92
 
        uint32_t *o = data;
 
105
        uint32_t *o = (uint32_t *)s->frame.data[0];
93
106
        for (; buf_size > 6; buf_size -= 7) {
94
107
            *o++ = (av_reverse[buf[2]]        << 24) |
95
108
                   (av_reverse[buf[1]]        << 16) |
100
113
                   (av_reverse[buf[3] & 0x0f] <<  4);
101
114
            buf += 7;
102
115
        }
103
 
        *data_size = (uint8_t*) o - (uint8_t*) data;
104
116
    } else if (avctx->bits_per_coded_sample == 20) {
105
 
        uint32_t *o = data;
 
117
        uint32_t *o = (uint32_t *)s->frame.data[0];
106
118
        for (; buf_size > 5; buf_size -= 6) {
107
119
            *o++ = (av_reverse[buf[2] & 0xf0] << 28) |
108
120
                   (av_reverse[buf[1]]        << 20) |
112
124
                   (av_reverse[buf[3]]        << 12);
113
125
            buf += 6;
114
126
        }
115
 
        *data_size = (uint8_t*) o - (uint8_t*) data;
116
127
    } else {
117
 
        uint16_t *o = data;
 
128
        uint16_t *o = (uint16_t *)s->frame.data[0];
118
129
        for (; buf_size > 4; buf_size -= 5) {
119
130
            *o++ = (av_reverse[buf[1]]        <<  8) |
120
131
                    av_reverse[buf[0]];
123
134
                   (av_reverse[buf[2]]        >>  4);
124
135
            buf += 5;
125
136
        }
126
 
        *data_size = (uint8_t*) o - (uint8_t*) data;
127
137
    }
128
138
 
129
 
    return buf - avpkt->data;
 
139
    *got_frame_ptr   = 1;
 
140
    *(AVFrame *)data = s->frame;
 
141
 
 
142
    return avpkt->size;
 
143
}
 
144
 
 
145
static int s302m_decode_init(AVCodecContext *avctx)
 
146
{
 
147
    S302MDecodeContext *s = avctx->priv_data;
 
148
 
 
149
    avcodec_get_frame_defaults(&s->frame);
 
150
    avctx->coded_frame = &s->frame;
 
151
 
 
152
    return 0;
130
153
}
131
154
 
132
155
 
134
157
    .name           = "s302m",
135
158
    .type           = AVMEDIA_TYPE_AUDIO,
136
159
    .id             = CODEC_ID_S302M,
137
 
    .priv_data_size = 0,
 
160
    .priv_data_size = sizeof(S302MDecodeContext),
 
161
    .init           = s302m_decode_init,
138
162
    .decode         = s302m_decode_frame,
 
163
    .capabilities   = CODEC_CAP_DR1,
139
164
    .long_name      = NULL_IF_CONFIG_SMALL("SMPTE 302M"),
140
165
};