Mercurial > libavcodec.hg
comparison mpeg12.c @ 903:22ee74da2cd3 libavcodec
cleanup
adding AVVideoFrame
moving quality, pict_type, key_frame, qscale_table, ... to AVVideoFrame
removing obsolete variables in AVCodecContext
skiping of MBs in b frames
correctly initalizing AVCodecContext
picture buffer cleanup
author | michaelni |
---|---|
date | Wed, 04 Dec 2002 10:04:03 +0000 |
parents | 653d9419ea01 |
children | 4b2c86f1fee9 |
comparison
equal
deleted
inserted
replaced
902:6acc8394960d | 903:22ee74da2cd3 |
---|---|
132 unsigned int vbv_buffer_size; | 132 unsigned int vbv_buffer_size; |
133 unsigned int fps, v; | 133 unsigned int fps, v; |
134 int n; | 134 int n; |
135 UINT64 time_code; | 135 UINT64 time_code; |
136 | 136 |
137 if (s->picture_in_gop_number == 0) { | 137 if (s->current_picture.key_frame) { |
138 /* mpeg1 header repeated every gop */ | 138 /* mpeg1 header repeated every gop */ |
139 put_header(s, SEQ_START_CODE); | 139 put_header(s, SEQ_START_CODE); |
140 | 140 |
141 /* search closest frame rate */ | 141 /* search closest frame rate */ |
142 { | 142 { |
1357 s->start_code = -1; | 1357 s->start_code = -1; |
1358 s->buf_ptr = s->buffer; | 1358 s->buf_ptr = s->buffer; |
1359 s->mpeg_enc_ctx.picture_number = 0; | 1359 s->mpeg_enc_ctx.picture_number = 0; |
1360 s->repeat_field = 0; | 1360 s->repeat_field = 0; |
1361 s->mpeg_enc_ctx.codec_id= avctx->codec->id; | 1361 s->mpeg_enc_ctx.codec_id= avctx->codec->id; |
1362 avctx->mbskip_table= s->mpeg_enc_ctx.mbskip_table; | |
1363 return 0; | 1362 return 0; |
1364 } | 1363 } |
1365 | 1364 |
1366 /* return the 8 bit start code value and update the search | 1365 /* return the 8 bit start code value and update the search |
1367 state. Return -1 if no start code found */ | 1366 state. Return -1 if no start code found */ |
1401 | 1400 |
1402 ref = get_bits(&s->gb, 10); /* temporal ref */ | 1401 ref = get_bits(&s->gb, 10); /* temporal ref */ |
1403 s->pict_type = get_bits(&s->gb, 3); | 1402 s->pict_type = get_bits(&s->gb, 3); |
1404 dprintf("pict_type=%d number=%d\n", s->pict_type, s->picture_number); | 1403 dprintf("pict_type=%d number=%d\n", s->pict_type, s->picture_number); |
1405 | 1404 |
1406 avctx->pict_type= s->pict_type; | |
1407 avctx->key_frame= s->pict_type == I_TYPE; | |
1408 | |
1409 skip_bits(&s->gb, 16); | 1405 skip_bits(&s->gb, 16); |
1410 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | 1406 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { |
1411 s->full_pel[0] = get_bits1(&s->gb); | 1407 s->full_pel[0] = get_bits1(&s->gb); |
1412 f_code = get_bits(&s->gb, 3); | 1408 f_code = get_bits(&s->gb, 3); |
1413 if (f_code == 0) | 1409 if (f_code == 0) |
1421 if (f_code == 0) | 1417 if (f_code == 0) |
1422 return -1; | 1418 return -1; |
1423 s->mpeg_f_code[1][0] = f_code; | 1419 s->mpeg_f_code[1][0] = f_code; |
1424 s->mpeg_f_code[1][1] = f_code; | 1420 s->mpeg_f_code[1][1] = f_code; |
1425 } | 1421 } |
1422 s->current_picture.pict_type= s->pict_type; | |
1423 s->current_picture.key_frame= s->pict_type == I_TYPE; | |
1426 s->y_dc_scale = 8; | 1424 s->y_dc_scale = 8; |
1427 s->c_dc_scale = 8; | 1425 s->c_dc_scale = 8; |
1428 s->first_slice = 1; | 1426 s->first_slice = 1; |
1429 return 0; | 1427 return 0; |
1430 } | 1428 } |
1574 * DECODE_SLICE_ERROR if the slice is damaged<br> | 1572 * DECODE_SLICE_ERROR if the slice is damaged<br> |
1575 * DECODE_SLICE_OK if this slice is ok<br> | 1573 * DECODE_SLICE_OK if this slice is ok<br> |
1576 * DECODE_SLICE_EOP if the end of the picture is reached | 1574 * DECODE_SLICE_EOP if the end of the picture is reached |
1577 */ | 1575 */ |
1578 static int mpeg_decode_slice(AVCodecContext *avctx, | 1576 static int mpeg_decode_slice(AVCodecContext *avctx, |
1579 AVPicture *pict, | 1577 AVVideoFrame *pict, |
1580 int start_code, | 1578 int start_code, |
1581 UINT8 *buf, int buf_size) | 1579 UINT8 *buf, int buf_size) |
1582 { | 1580 { |
1583 Mpeg1Context *s1 = avctx->priv_data; | 1581 Mpeg1Context *s1 = avctx->priv_data; |
1584 MpegEncContext *s = &s1->mpeg_enc_ctx; | 1582 MpegEncContext *s = &s1->mpeg_enc_ctx; |
1675 | 1673 |
1676 /* end of slice reached */ | 1674 /* end of slice reached */ |
1677 if (/*s->mb_x == 0 &&*/ | 1675 if (/*s->mb_x == 0 &&*/ |
1678 s->mb_y == s->mb_height) { | 1676 s->mb_y == s->mb_height) { |
1679 /* end of image */ | 1677 /* end of image */ |
1680 UINT8 **picture; | 1678 |
1679 if(s->mpeg2) | |
1680 s->qscale >>=1; | |
1681 | 1681 |
1682 MPV_frame_end(s); | 1682 MPV_frame_end(s); |
1683 | 1683 |
1684 if (s->pict_type == B_TYPE) { | 1684 if (s->pict_type == B_TYPE) { |
1685 picture = s->current_picture; | 1685 *pict= *(AVVideoFrame*)&s->current_picture; |
1686 avctx->quality = s->qscale; | |
1687 } else { | 1686 } else { |
1687 s->picture_number++; | |
1688 /* latency of 1 frame for I and P frames */ | 1688 /* latency of 1 frame for I and P frames */ |
1689 /* XXX: use another variable than picture_number */ | 1689 /* XXX: use another variable than picture_number */ |
1690 if (s->picture_number == 0) { | 1690 if (s->picture_number == 1) { |
1691 picture = NULL; | 1691 return DECODE_SLICE_OK; |
1692 } else { | 1692 } else { |
1693 picture = s->last_picture; | 1693 *pict= *(AVVideoFrame*)&s->last_picture; |
1694 avctx->quality = s->last_qscale; | 1694 } |
1695 } | 1695 } |
1696 s->last_qscale = s->qscale; | 1696 return DECODE_SLICE_EOP; |
1697 s->picture_number++; | |
1698 } | |
1699 if(s->mpeg2) | |
1700 avctx->quality>>=1; | |
1701 if (picture) { | |
1702 pict->data[0] = picture[0]; | |
1703 pict->data[1] = picture[1]; | |
1704 pict->data[2] = picture[2]; | |
1705 pict->linesize[0] = s->linesize; | |
1706 pict->linesize[1] = s->uvlinesize; | |
1707 pict->linesize[2] = s->uvlinesize; | |
1708 return DECODE_SLICE_EOP; | |
1709 } else { | |
1710 return DECODE_SLICE_OK; | |
1711 } | |
1712 } else { | 1697 } else { |
1713 return DECODE_SLICE_OK; | 1698 return DECODE_SLICE_OK; |
1714 } | 1699 } |
1715 } | 1700 } |
1716 | 1701 |
1825 UINT8 *buf, int buf_size) | 1810 UINT8 *buf, int buf_size) |
1826 { | 1811 { |
1827 Mpeg1Context *s = avctx->priv_data; | 1812 Mpeg1Context *s = avctx->priv_data; |
1828 UINT8 *buf_end, *buf_ptr, *buf_start; | 1813 UINT8 *buf_end, *buf_ptr, *buf_start; |
1829 int len, start_code_found, ret, code, start_code, input_size; | 1814 int len, start_code_found, ret, code, start_code, input_size; |
1830 AVPicture *picture = data; | 1815 AVVideoFrame *picture = data; |
1831 MpegEncContext *s2 = &s->mpeg_enc_ctx; | 1816 MpegEncContext *s2 = &s->mpeg_enc_ctx; |
1832 | 1817 |
1833 dprintf("fill_buffer\n"); | 1818 dprintf("fill_buffer\n"); |
1834 | 1819 |
1835 *data_size = 0; | 1820 *data_size = 0; |
1836 | 1821 |
1837 /* special case for last picture */ | 1822 /* special case for last picture */ |
1838 if (buf_size == 0) { | 1823 if (buf_size == 0) { |
1839 if (s2->picture_number > 0) { | 1824 if (s2->picture_number > 0) { |
1840 picture->data[0] = s2->next_picture[0]; | 1825 *picture= *(AVVideoFrame*)&s2->next_picture; |
1841 picture->data[1] = s2->next_picture[1]; | 1826 |
1842 picture->data[2] = s2->next_picture[2]; | 1827 *data_size = sizeof(AVVideoFrame); |
1843 picture->linesize[0] = s2->linesize; | |
1844 picture->linesize[1] = s2->uvlinesize; | |
1845 picture->linesize[2] = s2->uvlinesize; | |
1846 *data_size = sizeof(AVPicture); | |
1847 } | 1828 } |
1848 return 0; | 1829 return 0; |
1849 } | 1830 } |
1850 | 1831 |
1851 buf_ptr = buf; | 1832 buf_ptr = buf; |