Mercurial > libavcodec.hg
comparison mpegvideo.c @ 1586:3d1d0490e5a6 libavcodec
pts fix and related fixes
author | michael |
---|---|
date | Thu, 30 Oct 2003 16:58:49 +0000 |
parents | 628bf341e099 |
children | 4c9165372ab3 |
comparison
equal
deleted
inserted
replaced
1585:6b224ca24033 | 1586:3d1d0490e5a6 |
---|---|
1012 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */ | 1012 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */ |
1013 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */ | 1013 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */ |
1014 } | 1014 } |
1015 } | 1015 } |
1016 | 1016 |
1017 static int find_unused_picture(MpegEncContext *s, int shared){ | 1017 int ff_find_unused_picture(MpegEncContext *s, int shared){ |
1018 int i; | 1018 int i; |
1019 | 1019 |
1020 if(shared){ | 1020 if(shared){ |
1021 for(i=0; i<MAX_PICTURE_COUNT; i++){ | 1021 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
1022 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) break; | 1022 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i; |
1023 } | 1023 } |
1024 }else{ | 1024 }else{ |
1025 for(i=0; i<MAX_PICTURE_COUNT; i++){ | 1025 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
1026 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) break; //FIXME | 1026 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME |
1027 } | 1027 } |
1028 for(i=0; i<MAX_PICTURE_COUNT; i++){ | 1028 for(i=0; i<MAX_PICTURE_COUNT; i++){ |
1029 if(s->picture[i].data[0]==NULL) break; | 1029 if(s->picture[i].data[0]==NULL) return i; |
1030 } | 1030 } |
1031 } | 1031 } |
1032 | 1032 |
1033 assert(i<MAX_PICTURE_COUNT); | 1033 assert(0); |
1034 return i; | 1034 return -1; |
1035 } | 1035 } |
1036 | 1036 |
1037 /* generic function for encode/decode called before a frame is coded/decoded */ | 1037 /** |
1038 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded | |
1039 */ | |
1038 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) | 1040 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) |
1039 { | 1041 { |
1040 int i; | 1042 int i; |
1041 AVFrame *pic; | 1043 AVFrame *pic; |
1042 | |
1043 s->mb_skiped = 0; | 1044 s->mb_skiped = 0; |
1044 | 1045 |
1045 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3); | 1046 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3); |
1046 | 1047 |
1047 /* mark&release old frames */ | 1048 /* mark&release old frames */ |
1066 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ | 1067 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ |
1067 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]); | 1068 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]); |
1068 } | 1069 } |
1069 } | 1070 } |
1070 | 1071 |
1071 i= find_unused_picture(s, 0); | 1072 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL) |
1072 | 1073 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header) |
1073 pic= (AVFrame*)&s->picture[i]; | 1074 else{ |
1075 i= ff_find_unused_picture(s, 0); | |
1076 pic= (AVFrame*)&s->picture[i]; | |
1077 } | |
1078 | |
1074 pic->reference= s->pict_type != B_TYPE ? 3 : 0; | 1079 pic->reference= s->pict_type != B_TYPE ? 3 : 0; |
1075 | 1080 |
1076 if(s->current_picture_ptr) | 1081 if(s->current_picture_ptr) //FIXME broken, we need a coded_picture_number in MpegEncContext |
1077 pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1; | 1082 pic->coded_picture_number= s->current_picture_ptr->coded_picture_number+1; |
1078 | 1083 |
1079 if( alloc_picture(s, (Picture*)pic, 0) < 0) | 1084 if( alloc_picture(s, (Picture*)pic, 0) < 0) |
1080 return -1; | 1085 return -1; |
1081 | 1086 |
1082 s->current_picture_ptr= &s->picture[i]; | 1087 s->current_picture_ptr= (Picture*)pic; |
1083 } | 1088 } |
1084 | 1089 |
1085 s->current_picture_ptr->pict_type= s->pict_type; | 1090 s->current_picture_ptr->pict_type= s->pict_type; |
1086 // if(s->flags && CODEC_FLAG_QSCALE) | 1091 // if(s->flags && CODEC_FLAG_QSCALE) |
1087 // s->current_picture_ptr->quality= s->new_picture_ptr->quality; | 1092 // s->current_picture_ptr->quality= s->new_picture_ptr->quality; |
1423 if(pic_arg->linesize[2] != s->uvlinesize) direct=0; | 1428 if(pic_arg->linesize[2] != s->uvlinesize) direct=0; |
1424 | 1429 |
1425 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize); | 1430 // printf("%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize); |
1426 | 1431 |
1427 if(direct){ | 1432 if(direct){ |
1428 i= find_unused_picture(s, 1); | 1433 i= ff_find_unused_picture(s, 1); |
1429 | 1434 |
1430 pic= (AVFrame*)&s->picture[i]; | 1435 pic= (AVFrame*)&s->picture[i]; |
1431 pic->reference= 3; | 1436 pic->reference= 3; |
1432 | 1437 |
1433 for(i=0; i<4; i++){ | 1438 for(i=0; i<4; i++){ |
1435 pic->linesize[i]= pic_arg->linesize[i]; | 1440 pic->linesize[i]= pic_arg->linesize[i]; |
1436 } | 1441 } |
1437 alloc_picture(s, (Picture*)pic, 1); | 1442 alloc_picture(s, (Picture*)pic, 1); |
1438 }else{ | 1443 }else{ |
1439 int offset= 16; | 1444 int offset= 16; |
1440 i= find_unused_picture(s, 0); | 1445 i= ff_find_unused_picture(s, 0); |
1441 | 1446 |
1442 pic= (AVFrame*)&s->picture[i]; | 1447 pic= (AVFrame*)&s->picture[i]; |
1443 pic->reference= 3; | 1448 pic->reference= 3; |
1444 | 1449 |
1445 alloc_picture(s, (Picture*)pic, 0); | 1450 alloc_picture(s, (Picture*)pic, 0); |
1585 copy_picture(&s->new_picture, s->reordered_input_picture[0]); | 1590 copy_picture(&s->new_picture, s->reordered_input_picture[0]); |
1586 | 1591 |
1587 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){ | 1592 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){ |
1588 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable | 1593 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable |
1589 | 1594 |
1590 int i= find_unused_picture(s, 0); | 1595 int i= ff_find_unused_picture(s, 0); |
1591 Picture *pic= &s->picture[i]; | 1596 Picture *pic= &s->picture[i]; |
1592 | 1597 |
1593 /* mark us unused / free shared pic */ | 1598 /* mark us unused / free shared pic */ |
1594 for(i=0; i<4; i++) | 1599 for(i=0; i<4; i++) |
1595 s->reordered_input_picture[0]->data[i]= NULL; | 1600 s->reordered_input_picture[0]->data[i]= NULL; |