parser.c 9.92 KB
Newer Older
1 2 3 4 5
/*
 * Audio and Video frame extraction
 * Copyright (c) 2003 Fabrice Bellard.
 * Copyright (c) 2003 Michael Niedermayer.
 *
6 7 8
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
9 10
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14 15 16 17 18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22

23
#include "parser.h"
24 25 26

AVCodecParser *av_first_parser = NULL;

27 28 29 30 31
AVCodecParser* av_parser_next(AVCodecParser *p){
    if(p) return p->next;
    else  return av_first_parser;
}

32 33 34 35 36 37 38 39 40 41 42
void av_register_codec_parser(AVCodecParser *parser)
{
    parser->next = av_first_parser;
    av_first_parser = parser;
}

AVCodecParserContext *av_parser_init(int codec_id)
{
    AVCodecParserContext *s;
    AVCodecParser *parser;
    int ret;
43

44 45
    if(codec_id == CODEC_ID_NONE)
        return NULL;
46 47 48 49

    for(parser = av_first_parser; parser != NULL; parser = parser->next) {
        if (parser->codec_ids[0] == codec_id ||
            parser->codec_ids[1] == codec_id ||
Michael Niedermayer's avatar
Michael Niedermayer committed
50 51 52
            parser->codec_ids[2] == codec_id ||
            parser->codec_ids[3] == codec_id ||
            parser->codec_ids[4] == codec_id)
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
            goto found;
    }
    return NULL;
 found:
    s = av_mallocz(sizeof(AVCodecParserContext));
    if (!s)
        return NULL;
    s->parser = parser;
    s->priv_data = av_mallocz(parser->priv_data_size);
    if (!s->priv_data) {
        av_free(s);
        return NULL;
    }
    if (parser->parser_init) {
        ret = parser->parser_init(s);
        if (ret != 0) {
            av_free(s->priv_data);
            av_free(s);
            return NULL;
        }
    }
74
    s->fetch_timestamp=1;
75
    s->pict_type = FF_I_TYPE;
76 77 78
    return s;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
/**
 *
 * @param buf           input
 * @param buf_size      input length, to signal EOF, this should be 0 (so that the last frame can be output)
 * @param pts           input presentation timestamp
 * @param dts           input decoding timestamp
 * @param poutbuf       will contain a pointer to the first byte of the output frame
 * @param poutbuf_size  will contain the length of the output frame
 * @return the number of bytes of the input bitstream used
 *
 * Example:
 * @code
 *   while(in_len){
 *       len = av_parser_parse(myparser, AVCodecContext, &data, &size,
 *                                       in_data, in_len,
 *                                       pts, dts);
 *       in_data += len;
 *       in_len  -= len;
 *
Michael Niedermayer's avatar
Michael Niedermayer committed
98 99
 *       if(size)
 *          decode_frame(data, size);
Michael Niedermayer's avatar
Michael Niedermayer committed
100 101 102
 *   }
 * @endcode
 */
103
int av_parser_parse(AVCodecParserContext *s,
104
                    AVCodecContext *avctx,
105
                    uint8_t **poutbuf, int *poutbuf_size,
106 107
                    const uint8_t *buf, int buf_size,
                    int64_t pts, int64_t dts)
108
{
109
    int index, i, k;
110
    uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
111

112 113 114 115
    if (buf_size == 0) {
        /* padding is always necessary even if EOF, so we add it here */
        memset(dummy_buf, 0, sizeof(dummy_buf));
        buf = dummy_buf;
116 117 118 119 120 121 122 123 124
    } else {
        /* add a new packet descriptor */
        k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
        s->cur_frame_start_index = k;
        s->cur_frame_offset[k] = s->cur_offset;
        s->cur_frame_pts[k] = pts;
        s->cur_frame_dts[k] = dts;

        /* fill first PTS/DTS */
125 126
        if (s->fetch_timestamp){
            s->fetch_timestamp=0;
127 128
            s->last_pts = pts;
            s->last_dts = dts;
129
            s->last_offset = 0;
130 131
            s->cur_frame_pts[k] =
            s->cur_frame_dts[k] = AV_NOPTS_VALUE;
132
        }
133 134
    }

135
    /* WARNING: the returned index can be negative */
136
    index = s->parser->parser_parse(s, avctx, (const uint8_t **)poutbuf, poutbuf_size, buf, buf_size);
137
//av_log(NULL, AV_LOG_DEBUG, "parser: in:%"PRId64", %"PRId64", out:%"PRId64", %"PRId64", in:%d out:%d id:%d\n", pts, dts, s->last_pts, s->last_dts, buf_size, *poutbuf_size, avctx->codec_id);
138 139
    /* update the file pointer */
    if (*poutbuf_size) {
140
        /* fill the data for the current frame */
141
        s->frame_offset = s->last_frame_offset;
142 143
        s->pts = s->last_pts;
        s->dts = s->last_dts;
144
        s->offset = s->last_offset;
145

146
        /* offset of the next frame */
147
        s->last_frame_offset = s->cur_offset + index;
148 149 150 151 152 153 154 155 156 157 158 159
        /* find the packet in which the new frame starts. It
           is tricky because of MPEG video start codes
           which can begin in one packet and finish in
           another packet. In the worst case, an MPEG
           video start code could be in 4 different
           packets. */
        k = s->cur_frame_start_index;
        for(i = 0; i < AV_PARSER_PTS_NB; i++) {
            if (s->last_frame_offset >= s->cur_frame_offset[k])
                break;
            k = (k - 1) & (AV_PARSER_PTS_NB - 1);
        }
160

161 162
        s->last_pts = s->cur_frame_pts[k];
        s->last_dts = s->cur_frame_dts[k];
163
        s->last_offset = s->last_frame_offset - s->cur_frame_offset[k];
164

165 166 167 168 169
        /* some parsers tell us the packet size even before seeing the first byte of the next packet,
           so the next pts/dts is in the next chunk */
        if(index == buf_size){
            s->fetch_timestamp=1;
        }
170 171 172 173 174 175 176
    }
    if (index < 0)
        index = 0;
    s->cur_offset += index;
    return index;
}

177 178 179
/**
 *
 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
180
 * @deprecated use AVBitstreamFilter
181
 */
182 183
int av_parser_change(AVCodecParserContext *s,
                     AVCodecContext *avctx,
184
                     uint8_t **poutbuf, int *poutbuf_size,
185
                     const uint8_t *buf, int buf_size, int keyframe){
186

187
    if(s && s->parser->split){
188
        if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
189 190 191 192 193 194
            int i= s->parser->split(avctx, buf, buf_size);
            buf += i;
            buf_size -= i;
        }
    }

195 196
    /* cast to avoid warning about discarding qualifiers */
    *poutbuf= (uint8_t *) buf;
197 198 199
    *poutbuf_size= buf_size;
    if(avctx->extradata){
        if(  (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
200
            /*||(s->pict_type != FF_I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
201 202 203 204
            /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
            int size= buf_size + avctx->extradata_size;
            *poutbuf_size= size;
            *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
205

206
            memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
207
            memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
208 209 210 211 212 213 214
            return 1;
        }
    }

    return 0;
}

215 216 217 218 219 220 221 222 223 224 225 226
void av_parser_close(AVCodecParserContext *s)
{
    if (s->parser->parser_close)
        s->parser->parser_close(s);
    av_free(s->priv_data);
    av_free(s);
}

/*****************************************************/

/**
 * combines the (truncated) bitstream to a complete frame
227
 * @returns -1 if no complete frame could be created, AVERROR(ENOMEM) if there was a memory allocation error
228
 */
229
int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size)
230 231 232 233 234 235 236 237
{
#if 0
    if(pc->overread){
        printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
        printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
    }
#endif

Diego Biurrun's avatar
Diego Biurrun committed
238
    /* Copy overread bytes from last frame into buffer. */
239 240 241
    for(; pc->overread>0; pc->overread--){
        pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
    }
242 243 244 245 246 247

    /* flush remaining if EOF */
    if(!*buf_size && next == END_NOT_FOUND){
        next= 0;
    }

248 249 250 251
    pc->last_index= pc->index;

    /* copy into buffer end return */
    if(next == END_NOT_FOUND){
252
        void* new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
253

254 255 256
        if(!new_buffer)
            return AVERROR(ENOMEM);
        pc->buffer = new_buffer;
257 258 259 260 261 262 263
        memcpy(&pc->buffer[pc->index], *buf, *buf_size);
        pc->index += *buf_size;
        return -1;
    }

    *buf_size=
    pc->overread_index= pc->index + next;
264

265 266
    /* append to buffer */
    if(pc->index){
267
        void* new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
268

269 270 271
        if(!new_buffer)
            return AVERROR(ENOMEM);
        pc->buffer = new_buffer;
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
        memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
        pc->index = 0;
        *buf= pc->buffer;
    }

    /* store overread bytes */
    for(;next < 0; next++){
        pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
        pc->overread++;
    }

#if 0
    if(pc->overread){
        printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
        printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
    }
#endif

    return 0;
}

293
void ff_parse_close(AVCodecParserContext *s)
294
{
295
    ParseContext *pc = s->priv_data;
296 297 298 299

    av_free(pc->buffer);
}

300
void ff_parse1_close(AVCodecParserContext *s)
301
{
302
    ParseContext1 *pc1 = s->priv_data;
303

304 305
    av_free(pc1->pc.buffer);
    av_free(pc1->enc);
306 307
}

308 309
/*************************/

310
int ff_mpeg4video_split(AVCodecContext *avctx,
311 312 313 314
                           const uint8_t *buf, int buf_size)
{
    int i;
    uint32_t state= -1;
315

316 317 318
    for(i=0; i<buf_size; i++){
        state= (state<<8) | buf[i];
        if(state == 0x1B3 || state == 0x1B6)
319
            return i-3;
320 321 322
    }
    return 0;
}