FFmpeg
flac_parser.c
Go to the documentation of this file.
1 /*
2  * FLAC parser
3  * Copyright (c) 2010 Michael Chinen
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * FLAC parser
25  *
26  * The FLAC parser buffers input until FLAC_MIN_HEADERS has been found.
27  * Each time it finds and verifies a CRC-8 header it sees which of the
28  * FLAC_MAX_SEQUENTIAL_HEADERS that came before it have a valid CRC-16 footer
29  * that ends at the newly found header.
30  * Headers are scored by FLAC_HEADER_BASE_SCORE plus the max of its crc-verified
31  * children, penalized by changes in sample rate, frame number, etc.
32  * The parser returns the frame with the highest score.
33  **/
34 
35 #include "libavutil/attributes.h"
36 #include "libavutil/crc.h"
37 #include "libavutil/fifo.h"
38 #include "bytestream.h"
39 #include "parser.h"
40 #include "flac.h"
41 
42 /** maximum number of adjacent headers that compare CRCs against each other */
43 #define FLAC_MAX_SEQUENTIAL_HEADERS 4
44 /** minimum number of headers buffered and checked before returning frames */
45 #define FLAC_MIN_HEADERS 10
46 /** estimate for average size of a FLAC frame */
47 #define FLAC_AVG_FRAME_SIZE 8192
48 
49 /** scoring settings for score_header */
50 #define FLAC_HEADER_BASE_SCORE 10
51 #define FLAC_HEADER_CHANGED_PENALTY 7
52 #define FLAC_HEADER_CRC_FAIL_PENALTY 50
53 #define FLAC_HEADER_NOT_PENALIZED_YET 100000
54 #define FLAC_HEADER_NOT_SCORED_YET -100000
55 
56 /** largest possible size of flac header */
57 #define MAX_FRAME_HEADER_SIZE 16
58 
59 typedef struct FLACHeaderMarker {
60  int offset; /**< byte offset from start of FLACParseContext->buffer */
61  int *link_penalty; /**< pointer to array of local scores between this header
62  and the one at a distance equal array position */
63  int max_score; /**< maximum score found after checking each child that
64  has a valid CRC */
65  FLACFrameInfo fi; /**< decoded frame header info */
66  struct FLACHeaderMarker *next; /**< next CRC-8 verified header that
67  immediately follows this one in
68  the bytestream */
69  struct FLACHeaderMarker *best_child; /**< following frame header with
70  which this frame has the best
71  score with */
73 
74 typedef struct FLACParseContext {
75  AVCodecParserContext *pc; /**< parent context */
76  AVCodecContext *avctx; /**< codec context pointer for logging */
77  FLACHeaderMarker *headers; /**< linked-list that starts at the first
78  CRC-8 verified header within buffer */
79  FLACHeaderMarker *best_header; /**< highest scoring header within buffer */
80  int nb_headers_found; /**< number of headers found in the last
81  flac_parse() call */
82  int nb_headers_buffered; /**< number of headers that are buffered */
83  int best_header_valid; /**< flag set when the parser returns junk;
84  if set return best_header next time */
85  AVFifoBuffer *fifo_buf; /**< buffer to store all data until headers
86  can be verified */
87  int end_padded; /**< specifies if fifo_buf's end is padded */
88  uint8_t *wrap_buf; /**< general fifo read buffer when wrapped */
89  int wrap_buf_allocated_size; /**< actual allocated size of the buffer */
90  FLACFrameInfo last_fi; /**< last decoded frame header info */
91  int last_fi_valid; /**< set if last_fi is valid */
93 
94 static int frame_header_is_valid(AVCodecContext *avctx, const uint8_t *buf,
96 {
97  GetBitContext gb;
98  init_get_bits(&gb, buf, MAX_FRAME_HEADER_SIZE * 8);
99  return !ff_flac_decode_frame_header(avctx, &gb, fi, 127);
100 }
101 
102 /**
103  * Non-destructive fast fifo pointer fetching
104  * Returns a pointer from the specified offset.
105  * If possible the pointer points within the fifo buffer.
106  * Otherwise (if it would cause a wrap around,) a pointer to a user-specified
107  * buffer is used.
108  * The pointer can be NULL. In any case it will be reallocated to hold the size.
109  * If the returned pointer will be used after subsequent calls to flac_fifo_read_wrap
110  * then the subsequent calls should pass in a different wrap_buf so as to not
111  * overwrite the contents of the previous wrap_buf.
112  * This function is based on av_fifo_generic_read, which is why there is a comment
113  * about a memory barrier for SMP.
114  */
116  uint8_t** wrap_buf, int* allocated_size)
117 {
118  AVFifoBuffer *f = fpc->fifo_buf;
119  uint8_t *start = f->rptr + offset;
120  uint8_t *tmp_buf;
121 
122  if (start >= f->end)
123  start -= f->end - f->buffer;
124  if (f->end - start >= len)
125  return start;
126 
127  tmp_buf = av_fast_realloc(*wrap_buf, allocated_size, len);
128 
129  if (!tmp_buf) {
130  av_log(fpc->avctx, AV_LOG_ERROR,
131  "couldn't reallocate wrap buffer of size %d", len);
132  return NULL;
133  }
134  *wrap_buf = tmp_buf;
135  do {
136  int seg_len = FFMIN(f->end - start, len);
137  memcpy(tmp_buf, start, seg_len);
138  tmp_buf = (uint8_t*)tmp_buf + seg_len;
139 // memory barrier needed for SMP here in theory
140 
141  start += seg_len - (f->end - f->buffer);
142  len -= seg_len;
143  } while (len > 0);
144 
145  return *wrap_buf;
146 }
147 
148 /**
149  * Return a pointer in the fifo buffer where the offset starts at until
150  * the wrap point or end of request.
151  * len will contain the valid length of the returned buffer.
152  * A second call to flac_fifo_read (with new offset and len) should be called
153  * to get the post-wrap buf if the returned len is less than the requested.
154  **/
156 {
157  AVFifoBuffer *f = fpc->fifo_buf;
158  uint8_t *start = f->rptr + offset;
159 
160  if (start >= f->end)
161  start -= f->end - f->buffer;
162  *len = FFMIN(*len, f->end - start);
163  return start;
164 }
165 
167 {
169  uint8_t *header_buf;
170  int size = 0;
171  header_buf = flac_fifo_read_wrap(fpc, offset,
173  &fpc->wrap_buf,
175  if (frame_header_is_valid(fpc->avctx, header_buf, &fi)) {
176  FLACHeaderMarker **end_handle = &fpc->headers;
177  int i;
178 
179  size = 0;
180  while (*end_handle) {
181  end_handle = &(*end_handle)->next;
182  size++;
183  }
184 
185  *end_handle = av_mallocz(sizeof(**end_handle));
186  if (!*end_handle) {
187  av_log(fpc->avctx, AV_LOG_ERROR,
188  "couldn't allocate FLACHeaderMarker\n");
189  return AVERROR(ENOMEM);
190  }
191  (*end_handle)->fi = fi;
192  (*end_handle)->offset = offset;
193  (*end_handle)->link_penalty = av_malloc(sizeof(int) *
195  if (!(*end_handle)->link_penalty) {
196  av_freep(end_handle);
197  av_log(fpc->avctx, AV_LOG_ERROR,
198  "couldn't allocate link_penalty\n");
199  return AVERROR(ENOMEM);
200  }
201 
202  for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS; i++)
203  (*end_handle)->link_penalty[i] = FLAC_HEADER_NOT_PENALIZED_YET;
204 
205  fpc->nb_headers_found++;
206  size++;
207  }
208  return size;
209 }
210 
211 static int find_headers_search(FLACParseContext *fpc, uint8_t *buf, int buf_size,
212  int search_start)
213 
214 {
215  int size = 0, mod_offset = (buf_size - 1) % 4, i, j;
216  uint32_t x;
217 
218  for (i = 0; i < mod_offset; i++) {
219  if ((AV_RB16(buf + i) & 0xFFFE) == 0xFFF8)
220  size = find_headers_search_validate(fpc, search_start + i);
221  }
222 
223  for (; i < buf_size - 1; i += 4) {
224  x = AV_RB32(buf + i);
225  if (((x & ~(x + 0x01010101)) & 0x80808080)) {
226  for (j = 0; j < 4; j++) {
227  if ((AV_RB16(buf + i + j) & 0xFFFE) == 0xFFF8)
228  size = find_headers_search_validate(fpc, search_start + i + j);
229  }
230  }
231  }
232  return size;
233 }
234 
235 static int find_new_headers(FLACParseContext *fpc, int search_start)
236 {
238  int search_end, size = 0, read_len, temp;
239  uint8_t *buf;
240  fpc->nb_headers_found = 0;
241 
242  /* Search for a new header of at most 16 bytes. */
243  search_end = av_fifo_size(fpc->fifo_buf) - (MAX_FRAME_HEADER_SIZE - 1);
244  read_len = search_end - search_start + 1;
245  buf = flac_fifo_read(fpc, search_start, &read_len);
246  size = find_headers_search(fpc, buf, read_len, search_start);
247  search_start += read_len - 1;
248 
249  /* If fifo end was hit do the wrap around. */
250  if (search_start != search_end) {
251  uint8_t wrap[2];
252 
253  wrap[0] = buf[read_len - 1];
254  read_len = search_end - search_start + 1;
255 
256  /* search_start + 1 is the post-wrap offset in the fifo. */
257  buf = flac_fifo_read(fpc, search_start + 1, &read_len);
258  wrap[1] = buf[0];
259 
260  if ((AV_RB16(wrap) & 0xFFFE) == 0xFFF8) {
261  temp = find_headers_search_validate(fpc, search_start);
262  size = FFMAX(size, temp);
263  }
264  search_start++;
265 
266  /* Continue to do the last half of the wrap. */
267  temp = find_headers_search(fpc, buf, read_len, search_start);
268  size = FFMAX(size, temp);
269  search_start += read_len - 1;
270  }
271 
272  /* Return the size even if no new headers were found. */
273  if (!size && fpc->headers)
274  for (end = fpc->headers; end; end = end->next)
275  size++;
276  return size;
277 }
278 
280  FLACFrameInfo *header_fi,
281  FLACFrameInfo *child_fi,
282  int log_level_offset)
283 {
284  int deduction = 0;
285  if (child_fi->samplerate != header_fi->samplerate) {
286  deduction += FLAC_HEADER_CHANGED_PENALTY;
287  av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
288  "sample rate change detected in adjacent frames\n");
289  }
290  if (child_fi->bps != header_fi->bps) {
291  deduction += FLAC_HEADER_CHANGED_PENALTY;
292  av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
293  "bits per sample change detected in adjacent frames\n");
294  }
295  if (child_fi->is_var_size != header_fi->is_var_size) {
296  /* Changing blocking strategy not allowed per the spec */
297  deduction += FLAC_HEADER_BASE_SCORE;
298  av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
299  "blocking strategy change detected in adjacent frames\n");
300  }
301  if (child_fi->channels != header_fi->channels) {
302  deduction += FLAC_HEADER_CHANGED_PENALTY;
303  av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
304  "number of channels change detected in adjacent frames\n");
305  }
306  return deduction;
307 }
308 
312  int log_level_offset)
313 {
314  FLACFrameInfo *header_fi = &header->fi, *child_fi = &child->fi;
315  int deduction, deduction_expected = 0, i;
316  deduction = check_header_fi_mismatch(fpc, header_fi, child_fi,
317  log_level_offset);
318  /* Check sample and frame numbers. */
319  if ((child_fi->frame_or_sample_num - header_fi->frame_or_sample_num
320  != header_fi->blocksize) &&
321  (child_fi->frame_or_sample_num
322  != header_fi->frame_or_sample_num + 1)) {
323  FLACHeaderMarker *curr;
324  int expected_frame_num, expected_sample_num;
325  /* If there are frames in the middle we expect this deduction,
326  as they are probably valid and this one follows it */
327 
328  expected_frame_num = expected_sample_num = header_fi->frame_or_sample_num;
329  curr = header;
330  while (curr != child) {
331  /* Ignore frames that failed all crc checks */
332  for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS; i++) {
334  expected_frame_num++;
335  expected_sample_num += curr->fi.blocksize;
336  break;
337  }
338  }
339  curr = curr->next;
340  }
341 
342  if (expected_frame_num == child_fi->frame_or_sample_num ||
343  expected_sample_num == child_fi->frame_or_sample_num)
344  deduction_expected = deduction ? 0 : 1;
345 
346  deduction += FLAC_HEADER_CHANGED_PENALTY;
347  av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
348  "sample/frame number mismatch in adjacent frames\n");
349  }
350 
351  /* If we have suspicious headers, check the CRC between them */
352  if (deduction && !deduction_expected) {
353  FLACHeaderMarker *curr;
354  int read_len;
355  uint8_t *buf;
356  uint32_t crc = 1;
357  int inverted_test = 0;
358 
359  /* Since CRC is expensive only do it if we haven't yet.
360  This assumes a CRC penalty is greater than all other check penalties */
361  curr = header->next;
362  for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS && curr != child; i++)
363  curr = curr->next;
364 
368 
369  /* Although overlapping chains are scored, the crc should never
370  have to be computed twice for a single byte. */
371  start = header;
372  end = child;
373  if (i > 0 &&
374  header->link_penalty[i - 1] >= FLAC_HEADER_CRC_FAIL_PENALTY) {
375  while (start->next != child)
376  start = start->next;
377  inverted_test = 1;
378  } else if (i > 0 &&
379  header->next->link_penalty[i-1] >=
381  end = header->next;
382  inverted_test = 1;
383  }
384 
385  read_len = end->offset - start->offset;
386  buf = flac_fifo_read(fpc, start->offset, &read_len);
387  crc = av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf, read_len);
388  read_len = (end->offset - start->offset) - read_len;
389 
390  if (read_len) {
391  buf = flac_fifo_read(fpc, end->offset - read_len, &read_len);
392  crc = av_crc(av_crc_get_table(AV_CRC_16_ANSI), crc, buf, read_len);
393  }
394  }
395 
396  if (!crc ^ !inverted_test) {
397  deduction += FLAC_HEADER_CRC_FAIL_PENALTY;
398  av_log(fpc->avctx, AV_LOG_WARNING + log_level_offset,
399  "crc check failed from offset %i (frame %"PRId64") to %i (frame %"PRId64")\n",
400  header->offset, header_fi->frame_or_sample_num,
401  child->offset, child_fi->frame_or_sample_num);
402  }
403  }
404  return deduction;
405 }
406 
407 /**
408  * Score a header.
409  *
410  * Give FLAC_HEADER_BASE_SCORE points to a frame for existing.
411  * If it has children, (subsequent frames of which the preceding CRC footer
412  * validates against this one,) then take the maximum score of the children,
413  * with a penalty of FLAC_HEADER_CHANGED_PENALTY applied for each change to
414  * bps, sample rate, channels, but not decorrelation mode, or blocksize,
415  * because it can change often.
416  **/
418 {
420  int dist = 0;
421  int child_score;
422  int base_score = FLAC_HEADER_BASE_SCORE;
423  if (header->max_score != FLAC_HEADER_NOT_SCORED_YET)
424  return header->max_score;
425 
426  /* Modify the base score with changes from the last output header */
427  if (fpc->last_fi_valid) {
428  /* Silence the log since this will be repeated if selected */
429  base_score -= check_header_fi_mismatch(fpc, &fpc->last_fi, &header->fi,
430  AV_LOG_DEBUG);
431  }
432 
433  header->max_score = base_score;
434 
435  /* Check and compute the children's scores. */
436  child = header->next;
437  for (dist = 0; dist < FLAC_MAX_SEQUENTIAL_HEADERS && child; dist++) {
438  /* Look at the child's frame header info and penalize suspicious
439  changes between the headers. */
440  if (header->link_penalty[dist] == FLAC_HEADER_NOT_PENALIZED_YET) {
441  header->link_penalty[dist] = check_header_mismatch(fpc, header,
442  child, AV_LOG_DEBUG);
443  }
444  child_score = score_header(fpc, child) - header->link_penalty[dist];
445 
446  if (FLAC_HEADER_BASE_SCORE + child_score > header->max_score) {
447  /* Keep the child because the frame scoring is dynamic. */
448  header->best_child = child;
449  header->max_score = base_score + child_score;
450  }
451  child = child->next;
452  }
453 
454  return header->max_score;
455 }
456 
458 {
459  FLACHeaderMarker *curr;
460  int best_score = 0;//FLAC_HEADER_NOT_SCORED_YET;
461  /* First pass to clear all old scores. */
462  for (curr = fpc->headers; curr; curr = curr->next)
464 
465  /* Do a second pass to score them all. */
466  for (curr = fpc->headers; curr; curr = curr->next) {
467  if (score_header(fpc, curr) > best_score) {
468  fpc->best_header = curr;
469  best_score = curr->max_score;
470  }
471  }
472 }
473 
474 static int get_best_header(FLACParseContext* fpc, const uint8_t **poutbuf,
475  int *poutbuf_size)
476 {
478  FLACHeaderMarker *child = header->best_child;
479  if (!child) {
480  *poutbuf_size = av_fifo_size(fpc->fifo_buf) - header->offset;
481  } else {
482  *poutbuf_size = child->offset - header->offset;
483 
484  /* If the child has suspicious changes, log them */
485  check_header_mismatch(fpc, header, child, 0);
486  }
487 
488  if (header->fi.channels != fpc->avctx->channels ||
489  !fpc->avctx->channel_layout) {
490  fpc->avctx->channels = header->fi.channels;
492  }
493  fpc->avctx->sample_rate = header->fi.samplerate;
494  fpc->pc->duration = header->fi.blocksize;
495  *poutbuf = flac_fifo_read_wrap(fpc, header->offset, *poutbuf_size,
496  &fpc->wrap_buf,
498 
499 
500  if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS){
501  if (header->fi.is_var_size)
502  fpc->pc->pts = header->fi.frame_or_sample_num;
503  else if (header->best_child)
504  fpc->pc->pts = header->fi.frame_or_sample_num * header->fi.blocksize;
505  }
506 
507  fpc->best_header_valid = 0;
508  fpc->last_fi_valid = 1;
509  fpc->last_fi = header->fi;
510 
511  /* Return the negative overread index so the client can compute pos.
512  This should be the amount overread to the beginning of the child */
513  if (child)
514  return child->offset - av_fifo_size(fpc->fifo_buf);
515  return 0;
516 }
517 
519  const uint8_t **poutbuf, int *poutbuf_size,
520  const uint8_t *buf, int buf_size)
521 {
522  FLACParseContext *fpc = s->priv_data;
523  FLACHeaderMarker *curr;
524  int nb_headers;
525  const uint8_t *read_end = buf;
526  const uint8_t *read_start = buf;
527 
530  if (frame_header_is_valid(avctx, buf, &fi)) {
531  s->duration = fi.blocksize;
532  if (!avctx->sample_rate)
533  avctx->sample_rate = fi.samplerate;
534  if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS){
535  fpc->pc->pts = fi.frame_or_sample_num;
536  if (!fi.is_var_size)
537  fpc->pc->pts *= fi.blocksize;
538  }
539  }
540  *poutbuf = buf;
541  *poutbuf_size = buf_size;
542  return buf_size;
543  }
544 
545  fpc->avctx = avctx;
546  if (fpc->best_header_valid)
547  return get_best_header(fpc, poutbuf, poutbuf_size);
548 
549  /* If a best_header was found last call remove it with the buffer data. */
550  if (fpc->best_header && fpc->best_header->best_child) {
553 
554  /* Remove headers in list until the end of the best_header. */
555  for (curr = fpc->headers; curr != best_child; curr = temp) {
556  if (curr != fpc->best_header) {
557  av_log(avctx, AV_LOG_DEBUG,
558  "dropping low score %i frame header from offset %i to %i\n",
559  curr->max_score, curr->offset, curr->next->offset);
560  }
561  temp = curr->next;
562  av_freep(&curr->link_penalty);
563  av_free(curr);
564  fpc->nb_headers_buffered--;
565  }
566  /* Release returned data from ring buffer. */
567  av_fifo_drain(fpc->fifo_buf, best_child->offset);
568 
569  /* Fix the offset for the headers remaining to match the new buffer. */
570  for (curr = best_child->next; curr; curr = curr->next)
571  curr->offset -= best_child->offset;
572 
573  fpc->nb_headers_buffered--;
574  best_child->offset = 0;
575  fpc->headers = best_child;
577  fpc->best_header = best_child;
578  return get_best_header(fpc, poutbuf, poutbuf_size);
579  }
580  fpc->best_header = NULL;
581  } else if (fpc->best_header) {
582  /* No end frame no need to delete the buffer; probably eof */
584 
585  for (curr = fpc->headers; curr != fpc->best_header; curr = temp) {
586  temp = curr->next;
587  av_freep(&curr->link_penalty);
588  av_free(curr);
589  fpc->nb_headers_buffered--;
590  }
591  fpc->headers = fpc->best_header->next;
593  av_freep(&fpc->best_header);
594  fpc->nb_headers_buffered--;
595  }
596 
597  /* Find and score new headers. */
598  /* buf_size is to zero when padding, so check for this since we do */
599  /* not want to try to read more input once we have found the end. */
600  /* Note that as (non-modified) parameters, buf can be non-NULL, */
601  /* while buf_size is 0. */
602  while ((buf && buf_size && read_end < buf + buf_size &&
604  || ((!buf || !buf_size) && !fpc->end_padded)) {
605  int start_offset;
606 
607  /* Pad the end once if EOF, to check the final region for headers. */
608  if (!buf || !buf_size) {
609  fpc->end_padded = 1;
610  buf_size = MAX_FRAME_HEADER_SIZE;
611  read_end = read_start + MAX_FRAME_HEADER_SIZE;
612  } else {
613  /* The maximum read size is the upper-bound of what the parser
614  needs to have the required number of frames buffered */
615  int nb_desired = FLAC_MIN_HEADERS - fpc->nb_headers_buffered + 1;
616  read_end = read_end + FFMIN(buf + buf_size - read_end,
617  nb_desired * FLAC_AVG_FRAME_SIZE);
618  }
619 
620  if (!av_fifo_space(fpc->fifo_buf) &&
622  fpc->nb_headers_buffered * 20) {
623  /* There is less than one valid flac header buffered for 20 headers
624  * buffered. Therefore the fifo is most likely filled with invalid
625  * data and the input is not a flac file. */
626  goto handle_error;
627  }
628 
629  /* Fill the buffer. */
630  if ( av_fifo_space(fpc->fifo_buf) < read_end - read_start
631  && av_fifo_realloc2(fpc->fifo_buf, (read_end - read_start) + 2*av_fifo_size(fpc->fifo_buf)) < 0) {
632  av_log(avctx, AV_LOG_ERROR,
633  "couldn't reallocate buffer of size %"PTRDIFF_SPECIFIER"\n",
634  (read_end - read_start) + av_fifo_size(fpc->fifo_buf));
635  goto handle_error;
636  }
637 
638  if (buf && buf_size) {
639  av_fifo_generic_write(fpc->fifo_buf, (void*) read_start,
640  read_end - read_start, NULL);
641  } else {
642  int8_t pad[MAX_FRAME_HEADER_SIZE] = { 0 };
643  av_fifo_generic_write(fpc->fifo_buf, pad, sizeof(pad), NULL);
644  }
645 
646  /* Tag headers and update sequences. */
647  start_offset = av_fifo_size(fpc->fifo_buf) -
648  ((read_end - read_start) + (MAX_FRAME_HEADER_SIZE - 1));
649  start_offset = FFMAX(0, start_offset);
650  nb_headers = find_new_headers(fpc, start_offset);
651 
652  if (nb_headers < 0) {
653  av_log(avctx, AV_LOG_ERROR,
654  "find_new_headers couldn't allocate FLAC header\n");
655  goto handle_error;
656  }
657 
658  fpc->nb_headers_buffered = nb_headers;
659  /* Wait till FLAC_MIN_HEADERS to output a valid frame. */
660  if (!fpc->end_padded && fpc->nb_headers_buffered < FLAC_MIN_HEADERS) {
661  if (buf && read_end < buf + buf_size) {
662  read_start = read_end;
663  continue;
664  } else {
665  goto handle_error;
666  }
667  }
668 
669  /* If headers found, update the scores since we have longer chains. */
670  if (fpc->end_padded || fpc->nb_headers_found)
671  score_sequences(fpc);
672 
673  /* restore the state pre-padding */
674  if (fpc->end_padded) {
675  int warp = fpc->fifo_buf->wptr - fpc->fifo_buf->buffer < MAX_FRAME_HEADER_SIZE;
676  /* HACK: drain the tail of the fifo */
679  if (warp) {
680  fpc->fifo_buf->wptr += fpc->fifo_buf->end -
681  fpc->fifo_buf->buffer;
682  }
683  buf_size = 0;
684  read_start = read_end = NULL;
685  }
686  }
687 
688  for (curr = fpc->headers; curr; curr = curr->next) {
689  if (!fpc->best_header || curr->max_score > fpc->best_header->max_score) {
690  fpc->best_header = curr;
691  }
692  }
693 
694  if (fpc->best_header && fpc->best_header->max_score <= 0) {
695  // Only accept a bad header if there is no other option to continue
696  if (!buf_size || !buf || read_end != buf || fpc->nb_headers_buffered < FLAC_MIN_HEADERS)
697  fpc->best_header = NULL;
698  }
699 
700  if (fpc->best_header) {
701  fpc->best_header_valid = 1;
702  if (fpc->best_header->offset > 0) {
703  /* Output a junk frame. */
704  av_log(avctx, AV_LOG_DEBUG, "Junk frame till offset %i\n",
705  fpc->best_header->offset);
706 
707  /* Set duration to 0. It is unknown or invalid in a junk frame. */
708  s->duration = 0;
709  *poutbuf_size = fpc->best_header->offset;
710  *poutbuf = flac_fifo_read_wrap(fpc, 0, *poutbuf_size,
711  &fpc->wrap_buf,
713  return buf_size ? (read_end - buf) : (fpc->best_header->offset -
714  av_fifo_size(fpc->fifo_buf));
715  }
716  if (!buf_size)
717  return get_best_header(fpc, poutbuf, poutbuf_size);
718  }
719 
720 handle_error:
721  *poutbuf = NULL;
722  *poutbuf_size = 0;
723  return buf_size ? read_end - buf : 0;
724 }
725 
727 {
728  FLACParseContext *fpc = c->priv_data;
729  fpc->pc = c;
730  /* There will generally be FLAC_MIN_HEADERS buffered in the fifo before
731  it drains. This is allocated early to avoid slow reallocation. */
733  if (!fpc->fifo_buf) {
734  av_log(fpc->avctx, AV_LOG_ERROR,
735  "couldn't allocate fifo_buf\n");
736  return AVERROR(ENOMEM);
737  }
738  return 0;
739 }
740 
742 {
743  FLACParseContext *fpc = c->priv_data;
744  FLACHeaderMarker *curr = fpc->headers, *temp;
745 
746  while (curr) {
747  temp = curr->next;
748  av_freep(&curr->link_penalty);
749  av_free(curr);
750  curr = temp;
751  }
752  av_fifo_freep(&fpc->fifo_buf);
753  av_freep(&fpc->wrap_buf);
754 }
755 
758  .priv_data_size = sizeof(FLACParseContext),
759  .parser_init = flac_parse_init,
760  .parser_parse = flac_parse,
761  .parser_close = flac_parse_close,
762 };
static int frame_header_is_valid(AVCodecContext *avctx, const uint8_t *buf, FLACFrameInfo *fi)
Definition: flac_parser.c:94
#define NULL
Definition: coverity.c:32
static void score_sequences(FLACParseContext *fpc)
Definition: flac_parser.c:457
uint8_t * wptr
Definition: fifo.h:33
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
else temp
Definition: vf_mcdeint.c:256
int64_t frame_or_sample_num
frame number or sample number
Definition: flac.h:88
int codec_ids[5]
Definition: avcodec.h:5276
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
AVFifoBuffer * fifo_buf
buffer to store all data until headers can be verified
Definition: flac_parser.c:85
int duration
Duration of the current frame.
Definition: avcodec.h:5230
#define FLAC_HEADER_CRC_FAIL_PENALTY
Definition: flac_parser.c:52
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:87
FLACCOMMONINFO int blocksize
block size of the frame
Definition: flac.h:86
Macro definitions for various function/variable attributes.
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
Definition: fifo.c:122
AVCodecContext * avctx
codec context pointer for logging
Definition: flac_parser.c:76
int best_header_valid
flag set when the parser returns junk; if set return best_header next time
Definition: flac_parser.c:83
#define FLAC_AVG_FRAME_SIZE
estimate for average size of a FLAC frame
Definition: flac_parser.c:47
FLACFrameInfo last_fi
last decoded frame header info
Definition: flac_parser.c:90
uint8_t
#define av_cold
Definition: attributes.h:82
#define av_malloc(s)
int nb_headers_found
number of headers found in the last flac_parse() call
Definition: flac_parser.c:80
#define f(width, name)
Definition: cbs_vp9.c:255
AVS_FilterInfo AVS_Value child
Definition: avisynth_c.h:807
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
int wrap_buf_allocated_size
actual allocated size of the buffer
Definition: flac_parser.c:89
int av_fifo_space(const AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
Definition: fifo.c:82
#define FLAC_HEADER_NOT_SCORED_YET
Definition: flac_parser.c:54
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:87
Public header for CRC hash function implementation.
static int get_best_header(FLACParseContext *fpc, const uint8_t **poutbuf, int *poutbuf_size)
Definition: flac_parser.c:474
#define FLAC_HEADER_CHANGED_PENALTY
Definition: flac_parser.c:51
static void flac_parse_close(AVCodecParserContext *c)
Definition: flac_parser.c:741
#define FLAC_MAX_SEQUENTIAL_HEADERS
maximum number of adjacent headers that compare CRCs against each other
Definition: flac_parser.c:43
ptrdiff_t size
Definition: opengl_enc.c:100
static const uint8_t header[24]
Definition: sdr2.c:67
static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition: flac_parser.c:518
#define av_log(a,...)
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define PTRDIFF_SPECIFIER
Definition: internal.h:261
static int check_header_fi_mismatch(FLACParseContext *fpc, FLACFrameInfo *header_fi, FLACFrameInfo *child_fi, int log_level_offset)
Definition: flac_parser.c:279
FLAC (Free Lossless Audio Codec) decoder/demuxer common functions.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
#define wrap(func)
Definition: neontest.h:65
#define FFMAX(a, b)
Definition: common.h:94
int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, FLACFrameInfo *fi, int log_level_offset)
Validate and decode a frame header.
Definition: flac.c:50
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2276
int end_padded
specifies if fifo_buf&#39;s end is padded
Definition: flac_parser.c:87
struct FLACHeaderMarker * next
next CRC-8 verified header that immediately follows this one in the bytestream
Definition: flac_parser.c:66
#define FFMIN(a, b)
Definition: common.h:96
FLACHeaderMarker * headers
linked-list that starts at the first CRC-8 verified header within buffer
Definition: flac_parser.c:77
#define FLAC_MIN_HEADERS
minimum number of headers buffered and checked before returning frames
Definition: flac_parser.c:45
uint8_t * end
Definition: fifo.h:33
uint8_t * rptr
Definition: fifo.h:33
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
#define s(width, name)
Definition: cbs_vp9.c:257
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition: mem.c:476
static uint8_t * flac_fifo_read_wrap(FLACParseContext *fpc, int offset, int len, uint8_t **wrap_buf, int *allocated_size)
Non-destructive fast fifo pointer fetching Returns a pointer from the specified offset.
Definition: flac_parser.c:115
int last_fi_valid
set if last_fi is valid
Definition: flac_parser.c:91
if(ret)
int max_score
maximum score found after checking each child that has a valid CRC
Definition: flac_parser.c:63
static int find_headers_search_validate(FLACParseContext *fpc, int offset)
Definition: flac_parser.c:166
int av_fifo_size(const AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
Definition: fifo.c:77
uint8_t * wrap_buf
general fifo read buffer when wrapped
Definition: flac_parser.c:88
int sample_rate
samples per second
Definition: avcodec.h:2225
int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size)
Resize an AVFifoBuffer.
Definition: fifo.c:87
#define FLAC_HEADER_NOT_PENALIZED_YET
Definition: flac_parser.c:53
main external API structure.
Definition: avcodec.h:1565
a very simple circular buffer FIFO implementation
static int find_new_headers(FLACParseContext *fpc, int search_start)
Definition: flac_parser.c:235
void * buf
Definition: avisynth_c.h:766
void ff_flac_set_channel_layout(AVCodecContext *avctx)
Definition: flac.c:196
uint8_t * buffer
Definition: fifo.h:32
static int score_header(FLACParseContext *fpc, FLACHeaderMarker *header)
Score a header.
Definition: flac_parser.c:417
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:659
FLACFrameInfo fi
decoded frame header info
Definition: flac_parser.c:65
int * link_penalty
pointer to array of local scores between this header and the one at a distance equal array position ...
Definition: flac_parser.c:61
int nb_headers_buffered
number of headers that are buffered
Definition: flac_parser.c:82
#define MAX_FRAME_HEADER_SIZE
largest possible size of flac header
Definition: flac_parser.c:57
uint32_t wndx
Definition: fifo.h:34
AVCodecParserContext * pc
parent context
Definition: flac_parser.c:75
FLACHeaderMarker * best_header
highest scoring header within buffer
Definition: flac_parser.c:79
AVFifoBuffer * av_fifo_alloc_array(size_t nmemb, size_t size)
Initialize an AVFifoBuffer.
Definition: fifo.c:49
AVCodecParser ff_flac_parser
Definition: flac_parser.c:756
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
static int find_headers_search(FLACParseContext *fpc, uint8_t *buf, int buf_size, int search_start)
Definition: flac_parser.c:211
#define PARSER_FLAG_COMPLETE_FRAMES
Definition: avcodec.h:5142
int offset
byte offset from start of FLACParseContext->buffer
Definition: flac_parser.c:60
#define av_free(p)
int len
int channels
number of audio channels
Definition: avcodec.h:2226
static av_cold int flac_parse_init(AVCodecParserContext *c)
Definition: flac_parser.c:726
#define FLAC_HEADER_BASE_SCORE
scoring settings for score_header
Definition: flac_parser.c:50
int is_var_size
specifies if the stream uses variable block sizes or a fixed block size; also determines the meaning ...
Definition: flac.h:89
static uint8_t * flac_fifo_read(FLACParseContext *fpc, int offset, int *len)
Return a pointer in the fifo buffer where the offset starts at until the wrap point or end of request...
Definition: flac_parser.c:155
#define av_freep(p)
void INT64 start
Definition: avisynth_c.h:766
void av_fifo_freep(AVFifoBuffer **f)
Free an AVFifoBuffer and reset pointer to NULL.
Definition: fifo.c:63
struct FLACHeaderMarker * best_child
following frame header with which this frame has the best score with
Definition: flac_parser.c:69
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
void av_fifo_drain(AVFifoBuffer *f, int size)
Discard data from the FIFO.
Definition: fifo.c:233
#define PARSER_FLAG_USE_CODEC_TS
Definition: avcodec.h:5146
static int check_header_mismatch(FLACParseContext *fpc, FLACHeaderMarker *header, FLACHeaderMarker *child, int log_level_offset)
Definition: flac_parser.c:309